2013-08-02 31 views
15

Tôi có đoạn code Java sau:Java RegEx tiêu cực lookbehind

Pattern pat = Pattern.compile("(?<!function)\\w+"); 
Matcher mat = pat.matcher("function example"); 
System.out.println(mat.find()); 

Tại sao mat.find() trở thành sự thật? Tôi đã sử dụng lookbehind tiêu cực và example là trước bởi function. Không nên bỏ đi?

Trả lời

29

Xem những gì nó phù hợp:

public static void main(String[] args) throws Exception { 
    Pattern pat = Pattern.compile("(?<!function)\\w+"); 
    Matcher mat = pat.matcher("function example"); 
    while (mat.find()) { 
     System.out.println(mat.group()); 
    } 
} 

Output:

function 
xample 

Vì vậy, đầu tiên nó tìm thấy function, mà không được đi trước bởi "function". Sau đó, nó tìm thấy xample trước bởi function e và do đó không phải là "function".

Có lẽ bạn muốn mẫu phù hợp với văn bản toàn bộ, không chỉ tìm thấy các kết quả phù hợp trong văn bản.

Bạn có thể làm điều này với Matcher.matches() hoặc bạn có thể thay đổi các mô hình để thêm đầu và cuối neo:

^(?<!function)\\w+$ 

Tôi thích cách tiếp cận thứ hai vì nó có nghĩa là mô hình tự định nghĩa khu vực phù hợp với mình chứ không thì vùng được xác định bằng cách sử dụng nó. Đó chỉ là vấn đề ưu tiên.

1

Chuỗi của bạn có từ "chức năng" khớp với \ w + và không có trước "hàm".

0

Chú ý hai điều ở đây:

  • Bạn đang sử dụng find() trả về đúng cho một tiểu chuỗi trận đấu là tốt.

  • Do ở trên, "hàm" khớp với vì nó không có trước "hàm".
    Toàn bộ chuỗi sẽ không bao giờ khớp với nhau bởi vì regex của bạn không bao gồm dấu cách.

Sử dụng Mathcher#matches() hoặc ^$ neo với một lookahead tiêu cực thay vì:

Pattern pat = Pattern.compile("^(?!function)[\\w\\s]+$"); // added \s for whitespaces 
Matcher mat = pat.matcher("function example"); 

System.out.println(mat.find()); // false 
Các vấn đề liên quan