2013-08-02 7 views
15

ich den folgenden Java-Code haben:Java RegEx negativen Lookbehind

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

Warum mat.find() return true? Ich habe negative Lookbehind verwendet und example ist function vorangestellt. Sollte es nicht verworfen werden?

Antwort

29

Sehen Sie, was es passt:

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

Ausgang:

function 
xample 

So zuerst findet function, die durch "function" nicht vorangeht. Dann findet es xample, dem function e vorausgeht und daher nicht "function".

Vermutlich wollen Sie das Muster der ganze Text passen, nicht nur Matches in der Text finden.

können Sie entweder tun dies mit Matcher.matches() oder Sie können das Muster ändern Start- und Ziel Anker hinzuzufügen:

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

ich den zweiten Ansatz bevorzugen, da es bedeutet, dass das Muster selbst seinen Match Bereich definiert dann eher der Region wird durch ihre Verwendung definiert. Das ist nur eine Frage der Präferenz.

1

Ihre Zeichenfolge enthält das Wort "function", das \ w + entspricht und nicht vor "function" steht.

0

Hinweis hier zwei Dinge:

  • Sie find() verwendet, die auch wahre für eine Unterkette Spiel zurück.

  • Aus dem oben genannten ergibt sich "Funktion", da ihm nicht "Funktion" vorangestellt ist.
    Die ganze Zeichenfolge würde nie übereinstimmen, da Ihre Regex nicht Leerzeichen enthalten. Statt

Verwenden Mathcher#matches() oder ^ und $ Anker mit einem negativen Look-Ahead:

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

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