2013-08-02 17 views
15

Mam następujący kod Java:Java RegEx ujemny lookbehind

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

Dlaczego mat.find() powrót prawda? Użyłem negatywnego lookbehind, a example jest poprzedzony function. Czy nie powinien zostać odrzucony?

Odpowiedz

29

Zobacz co pasuje:

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()); 
    } 
} 

wyjściowa:

function 
xample 

Więc najpierw stwierdzi function, która nie jest poprzedzona "function". Następnie znajduje xample, który jest poprzedzony function e, a zatem nie "function".

Przypuszczalnie chcesz wzór dopasować tekst cały, nie tylko znaleźć mecze w tekstu.

Można to zrobić z Matcher.matches() czy można zmienić wzór do dodania początkowe i końcowe kotwice:

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

Wolę drugie podejście, to znaczy, że sam wzór określa jego obszar dopasowania a następnie region jest określony przez jego użycie. To tylko kwestia preferencji.

1

Twój ciąg ma słowo "funkcja" pasujące do \ w + i nie jest poprzedzone "funkcją".

0

Wskazówka dwie rzeczy tutaj:

  • Używasz find() która zwraca prawdziwą dla podciąg meczu, jak również.

  • Z tego powodu "funkcja" dopasowuje się, ponieważ nie jest poprzedzona "funkcją".
    Cały ciąg nigdy by się nie dopasował, ponieważ regex nie zawierał spacji w postaci .

Zastosowanie Mathcher#matches() lub ^ i $ kotwy z ujemnym lookAhead Zamiast:

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

System.out.println(mat.find()); // false