2012-02-27 43 views
16

Hãy xem xét các đoạn mã sau:Làm thế nào để tìm chính xác từ bằng cách sử dụng một regex trong Java?

String input = "Print this"; 
System.out.println(input.matches("\\bthis\\b")); 

Output

false 

Điều gì có thể có thể xảy ra với phương pháp này? Nếu nó sai, thì giải pháp đúng để tìm từ khớp chính xác là gì?

PS: Tôi đã tìm thấy nhiều câu hỏi tương tự ở đây nhưng không có câu hỏi nào trong số chúng cung cấp giải pháp mà tôi đang tìm kiếm. Đó là một vấn đề thẳng về phía trước mà tôi không thể tìm ra giải pháp đúng.

Xin cảm ơn trước.

Trả lời

25

Khi bạn sử dụng phương pháp matches(), nó đang cố gắng khớp với toàn bộ đầu vào. Trong ví dụ của bạn, đầu vào "In này" không khớp với mẫu vì từ "In" không khớp.

Vì vậy, bạn cần phải thêm nội dung nào đó vào regex để khớp với phần ban đầu của chuỗi, ví dụ:

.*\\bthis\\b 

Và nếu bạn muốn cho phép thêm văn bản ở cuối dòng quá:

.*\\bthis\\b.* 

Ngoài ra, sử dụng một đối tượng Matcher và sử dụng Matcher.find() để tìm trận đấu trong chuỗi đầu vào:

Pattern p = Pattern.compile("\\bthis\\b"); 
    Matcher m = p.matcher("Print this"); 
    m.find(); 
    System.out.println(m.group()); 

Đầu ra:

this 

Nếu bạn muốn tìm nhiều kết quả phù hợp trong một dòng, bạn có thể gọi find()group() nhiều lần để trích xuất tất cả.

4

Đối với một lời giải thích tốt, xem: http://www.regular-expressions.info/java.html

myString.matches ("regex") trả về true hoặc false tùy liệu chuỗi có thể được xuất hiện hoàn toàn bằng các biểu thức chính quy. Nó là quan trọng cần nhớ rằng String.matches() chỉ trả về true nếu có thể kết hợp toàn bộ chuỗi . Nói cách khác: "regex" được áp dụng như thể bạn đã viết "^ regex $" khi bắt đầu và kết thúc chuỗi neo. khác với hầu hết các thư viện regex khác, trong đó phương thức "nhanh khớp " thử trả về true nếu regex có thể được đối sánh ở bất kỳ đâu trong chuỗi . Nếu myString là abc thì myString.matches ("bc") trả về false. bc khớp với abc, nhưng^bc $ (thực sự được sử dụng ở đây) thì không.

này viết "true":

String input = "Print this"; 
System.out.println(input.matches(".*\\bthis\\b")); 
2

Bạn có thể sử dụng các nhóm để tìm từ chính xác. Regex API chỉ định các nhóm theo dấu ngoặc đơn.Ví dụ:

A(B(C))D

Tuyên bố này bao gồm ba nhóm, được lập chỉ mục từ 0.

  • 0 nhóm - ABCD
  • 1 nhóm - BC
  • nhóm 2 - C

Vì vậy, nếu bạn cần tìm một số từ cụ thể, bạn có thể sử dụng hai phương pháp tôi n Matcher lớp như: find() để tìm câu nêu cụ thể regex, và sau đó nhận được một đối tượng String xác định bởi số lượng nhóm của nó:

String statement = "Hello, my beautiful world"; 
Pattern pattern = Pattern.compile("Hello, my (\\w+).*"); 
Matcher m = pattern.matcher(statement); 
m.find(); 
System.out.println(m.group(1)); 

Kết quả mã trên sẽ là "đẹp"

+0

'find()' trả về giá trị boolean cho biết kết quả khớp có thành công hay không. Bạn nên * không bao giờ * gọi 'find()' và bỏ qua kết quả. Ditto cho 'matches()' và 'lookingAt()'. Ngoài ra, các số nhóm được lập chỉ mục từ một số, không phải số không. Nhóm "đầu tiên", 'nhóm (0)', là một nhóm nhân tạo đại diện cho toàn bộ trận đấu. –

1

là bạn searchString đi là cụm từ thông dụng? nếu không chỉ cần sử dụng String.contains(CharSequence s)

+1

Lưu ý rằng khi bạn chuyển '" này "' vào phương thức 'contains', nó cũng trả về true, nếu chuỗi đầu vào là' "isthisnice" 'không có dấu cách. Vì vậy, bạn không biết, nếu trận đấu là từ chính xác. –

8

phương pháp dụ đầy đủ cho các khớp:

public static String REGEX_FIND_WORD="(?i).*?\\b%s\\b.*?"; 

public static boolean containsWord(String text, String word) { 
    String regex=String.format(REGEX_FIND_WORD, Pattern.quote(word)); 
    return text.matches(regex); 
} 

Giải thích: (? i)

  1. - IgnoreCase
  2. *.? - cho phép (optinally) bất kỳ ký tự trước
  3. \ b - từ ranh giới
  4. % s - biến phải được thay đổi bởi String.format (trích dẫn để tránh regex lỗi)
  5. \ b - ranh giới từ
  6. . *? - cho phép (optinally) bất kỳ ký tự nào sau
+0

'. *' Đã là _any ký tự 0 hoặc nhiều lần_ vì vậy bạn không cần '?'. –

0

System.out.println (input.matches (". * \\ bthis $"));

Cũng hoạt động. Ở đây. * Phù hợp với bất cứ điều gì trước khi không gian và sau đó điều này là phù hợp để được từ cuối cùng.

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