2013-03-14 5 views
45

Tôi đang cố gắng để hiểu Pattern.quote sử dụng đoạn mã sau:Cách sử dụng phương thức Pattern.quote là gì?

String pattern = Pattern.quote("1252343% 8 567 hdfg gf^$545"); 
System.out.println("Pattern is : "+pattern); 

sản xuất đầu ra:

Pattern is : \Q1252343% 8 567 hdfg gf^$545\E 

\Q\E đây? Mô tả tài liệu cho biết:

Trả lại mẫu chữ String cho số được chỉ định String.

Phương pháp này tạo ra một String có thể được sử dụng để tạo một Pattern khớp với chuỗi s như thể nó là một kiểu chữ.

Siêu ký tự hoặc chuỗi thoát trong chuỗi đầu vào sẽ không có ý nghĩa đặc biệt.

Nhưng loại trả về String và không phải là đối tượng biên soạn Pattern.

Tại sao phương pháp này được yêu cầu và một số ví dụ sử dụng là gì?

Trả lời

54

\Q có nghĩa là "sự khởi đầu của văn bản văn chương" (tức là regex "mở quote")
\E nghĩa "kết thúc của văn bản văn chương" (tức là regex "gần quote")

Gọi phương thức Pattern.quote() kết thúc tốt đẹp các chuỗi trong \Q...\E, biến văn bản thành một regex chữ số. Ví dụ, Pattern.quote(".*") sẽ phù hợp với một dấu chấm và sau đó là một dấu hoa thị:

System.out.println("foo".matches(".*")); // true 
System.out.println("foo".matches(Pattern.quote(".*"))); // false 
System.out.println(".*".matches(Pattern.quote(".*"))); // true 

Mục đích của phương pháp là để không đòi hỏi lập trình viên phải nhớ các điều khoản đặc biệt \Q\E và để thêm một chút khả năng đọc mã - regex là khó đủ để đọc rồi. Hãy so sánh:

someString.matches(Pattern.quote(someLiteral)); 
someString.matches("\\Q" + someLiteral + "\\E")); 

Nhắc đến javadoc:

Trả về một mô hình chuỗi literal cho String quy định.

Phương pháp này tạo ra một chuỗi có thể được sử dụng để tạo ra một mẫu phù hợp với chuỗi như thể nó là một mẫu chữ.

Siêu ký tự hoặc chuỗi thoát trong chuỗi đầu vào sẽ không có ý nghĩa đặc biệt.

+5

Tương đương chính xác với 'someString.matches (Pattern.quote (someLiteral))' thực sự là 'someString.matches (" \\ Q "+ someLiteral.replace (" \\ E "," \\ E \\\ \ E \\ Q ") +" \\ E ")' – kbolino

+0

@kbolino Rofl. Và những gì về thay thế "\\ Q"? – Andrew

+0

@Andrew Nó cũng xử lý: '" \\ Q \\ E ".matches (Pattern.quote (" \\ Q \\ E ")) // true'. – Bohemian

7

Nếu bạn biên dịch Chuỗi được trả lại bằng Pattern.quote, bạn sẽ nhận được một Pattern khớp với chuỗi ký tự mà bạn quote d.

\Q\E đánh dấu phần đầu và phần cuối của chuỗi được trích dẫn.

8

\Q\E, trong số tất cả những người khác, là tài liệu triệt để trên trang java.util.regex.Pattern Javadoc. Chúng có nghĩa là "bắt đầu Q uote", "E trích dẫn thứ hai" và bỏ qua một khu vực nơi tất cả các ký tự có nghĩa đen. Cách sử dụng sự trở lại của Pattern.quote là cấp dữ liệu đó cho Pattern.compile hoặc bất kỳ phương pháp nào khác chấp nhận chuỗi mẫu, chẳng hạn như String.split.

7

Regex va chạm thường xuyên với các chuỗi thông thường. Nói rằng tôi muốn một regex để tìm kiếm một chuỗi nhất định mà chỉ được biết đến trong thời gian chạy. Làm thế nào chúng ta có thể chắc chắn rằng chuỗi không có ý nghĩa regex ví dụ (".*.*.*")? Chúng tôi báo giá.

+0

Thật vậy, một ví dụ như vậy là khi bạn muốn thay thế sự xuất hiện đầu tiên của chuỗi con, nhưng String.replaceFirst lấy một regex, khi bạn muốn chuyển một chuỗi ký tự bằng chữ. –

15

Phương thức Pattern.quote trích dẫn một phần của mẫu regex để làm cho regex diễn giải nó dưới dạng chuỗi ký tự chuỗi.

Giả sử bạn có một số thông tin nhập của người dùng trong chương trình tìm kiếm và bạn muốn regex cho nó. Nhưng đầu vào này có thể có nhân vật không an toàn, do đó bạn có thể sử dụng

Pattern pattern = Pattern.compile(Pattern.quote(userInput)); 

Phương pháp này không trích dẫn một Pattern nhưng, như bạn chỉ ra, kết thúc tốt đẹp một String trong dấu ngoặc kép regex.