2010-10-04 38 views
18

Tôi có Java chuỗi:Java biểu thức thông thường và ký hiệu đô la

String b = "/feedback/com.school.edu.domain.feedback.Review$0/feedbackId"); 

Tôi cũng đã tạo ra mô hình dựa vào đó tôi muốn để phù hợp với chuỗi này:

String pattern = "/feedback/com.school.edu.domain.feedback.Review$0(.)*"; 

Khi tôi nói b.matches(pattern) nó trả false. Bây giờ tôi biết ký hiệu đô la là một phần của Java RegEx, nhưng tôi không biết mẫu của tôi trông như thế nào. Tôi giả định rằng $ trong mô hình cần phải được thay thế bằng một số ký tự thoát, nhưng không biết bao nhiêu. Ký hiệu $ này rất quan trọng đối với tôi vì nó giúp tôi phân biệt các yếu tố trong danh sách (số sau đô la), và tôi không thể không có nó.

+0

Chỉ cần rõ ràng, '$' trong regex khớp với kết thúc của dòng. Regex của bạn sẽ khớp với một chuỗi có dòng đầu tiên kết thúc bằng 'Đánh giá' và dòng tiếp theo bắt đầu bằng ký tự' 0'. – Amarghosh

+3

@ Amarghosh: Tôi không nghĩ vậy. Regex này có thể * không bao giờ * khớp vì phải có CR và/hoặc LF giữa phần cuối của dòng và các ký tự đầu tiên của dòng thứ hai. –

+1

@Tim Rất tiếc, bạn nói đúng - tôi đã bỏ lỡ nó. Vì tôi không thể chỉnh sửa nhận xét nữa, hãy để tôi chỉ yêu cầu mọi người __đọc sửa chữa của Tim cho bình luận đầu tiên của tôi__ – Amarghosh

Trả lời

27

Bạn cần phải thoát khỏi $trong regex với một back-slash (\), nhưng như một back-slash là một nhân vật chạy thoát trong chuỗi bạn cần phải thoát khỏi back-slash riêng của mình.

Bạn sẽ cần phải thoát khỏi bất kỳ char regex đặc biệt nào theo cùng một cách, ví dụ: ".".

String pattern = "/feedback/com\\.navteq\\.lcms\\.common\\.domain\\.poi\\.feedback\\.Review\\$0(.)*"; 
6

Trong Java regex cả .$ là đặc biệt. Bạn cần phải thoát khỏi nó với 2 gạch chéo ngược, tức là.

"/feedback/com\\.navtag\\.etc\\.Review\\$0(.*)" 

(1 dấu chéo ngược là cho chuỗi Java, và 1 là dành cho động cơ regex.)

2

thoát với đồng đô la với \

String pattern = 
    "/feedback/com.navteq.lcms.common.domain.poi.feedback.Review\\$0(.)*"; 

Tôi khuyên bạn nên thoát khỏi ., . đại diện cho bất kỳ ký tự nào.

String pattern = 
    "/feedback/com\\.navteq\\.lcms\\.common\\.domain\\.poi\\.feedback\\.Review\\$0(.)*"; 
45

Sử dụng

String escapedString = java.util.regex.Pattern.quote(myString) 

để automatically escape all special regex characters trong một chuỗi cho trước.

+1

Câu trả lời của bạn thật tuyệt vời! –

+0

Điều này cần nhiều upvotes hơn, lấy của tôi. –

Các vấn đề liên quan