2011-01-25 40 views
8

tầm thường câu hỏi regex (câu trả lời là có lẽ hầu hết Java-cụ thể):Tại sao regex này không hoạt động như mong đợi trong Java?

"#This is a comment in a file".matches("^#") 

này trả về false. Theo như tôi thấy, ^ có nghĩa là nó luôn có ý nghĩa và # không có ý nghĩa đặc biệt, vì vậy tôi sẽ dịch ^# thành "A '#' ở đầu chuỗi". Mà nên phù hợp. Và như vậy, trong Perl:

perl -e "print '#This is a comment'=~/^#/;" 

in "1". Vì vậy, tôi khá chắc chắn câu trả lời là một cái gì đó cụ thể Java. Ai đó có thể làm sáng tỏ tôi không?

Cảm ơn bạn.

Trả lời

17

Matcher.matches() kiểm tra xem có phải toàn bộ chuỗi đầu vào được so khớp với regex hay không.

Vì regex của bạn chỉ khớp với ký tự đầu tiên, nó trả về false.

Thay vào đó, bạn sẽ muốn sử dụng Matcher.find().

Cấp, nó có thể là một chút khó khăn để tìm thấy những đặc điểm kỹ thuật cụ thể, nhưng nó ở đó:

  • String.matches() được định nghĩa là làm điều tương tự như Pattern.matches(regex, str).
  • Pattern.matches() lần lượt được định nghĩa là Pattern.compile(regex).matcher(input).matches().
  • Matcher.matches() được ghi chép lại như thế này (tôi nhấn mạnh):

    Nỗ lực để phù hợp với toàn bộ khu vực chống lại mô hình.

+0

Đây là câu trả lời đúng, cảm ơn bạn. Đây có phải là tài liệu ở đâu đó không? Bởi vì tôi không thể đọc điều này từ tài liệu của String.matches: "Cho biết chuỗi này có phù hợp với cụm từ thông dụng nhất định hay không." không giống như những gì bạn mô tả. – 0xCAFEBABE

+0

Tôi đã luôn luôn hiểu "phù hợp" để ngụ ý "toàn bộ đầu vào", nhưng tôi đã thêm lời giải thích đầy đủ (và cách tìm nó) ở trên. –

+0

Cảm ơn một nhóm. – 0xCAFEBABE

2

Phương pháp matches phù hợp regex của bạn chống lại các toàn bộ chuỗi.

Vì vậy hãy thử thêm .* để khớp với phần còn lại của chuỗi.

"#This is a comment in a file".matches("^#.*") 

trả về true. Một thậm chí có thể thả tất cả các neo (cả hai bắt đầu và kết thúc) từ regex và phương pháp match sẽ thêm nó cho chúng tôi. Vì vậy, trong trường hợp trên chúng ta có thể cũng đã sử dụng "#.*" làm regex.

+0

... sẽ chỉ hoạt động nếu chuỗi không chứa bất kỳ dòng mới nào, trừ khi bạn thêm '(? S)' vào regex của mình ... –

0

này phải đáp ứng mong đợi của bạn:

"#This is a comment in a file".matches("^#.*$") 

Bây giờ đầu vào chuỗi phù hợp với mô hình "Đầu tiên char sẽ #, phần còn lại sẽ được bất kỳ char"


Sau Joachims bình luận, các sau đây tương đương:

"#This is a comment in a file".matches("#.*") 
+0

Trong trường hợp này, cả hai ký tự ('^' và '$') đều là không cần thiết, vì chúng được ngụ ý bởi 'matches()'. –

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