2013-08-02 12 views
15

私は、次のJavaコードを持っている:Javaの正規表現否定後読み

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

なぜmat.find()リターンは本当でしょうか?私は否定的なlookbehindを使用してexampleの前にfunctionがあります。それは捨てられてはいけませんか?

答えて

29

それが一致するものを参照してください:

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

出力:

function 
xample 

だから、最初は "function" が付いていないfunctionを、見つけました。次に、の前に "function"が表示されていないxampleが見つかりました。

おそらくあなたはパターンがちょうどマッチでテキストを見つけることができません全体テキストをマッチさせたいです。

あなたはMatcher.matches()でこれを行うことができますいずれか、またはあなたは、開始と終了のアンカーを追加するためのパターンを変更することができます:それはパターンそのものではなく、その試合の領域を画定することを意味する

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

は、私は2番目のアプローチを好みます領域はその使用法によって定義される。しかしそれはただの優先事項です。ここ

1

あなたの文字列には、\ w +と一致する単語 "function"があり、 "function"の前にはありません。

0

お知らせ二つのこと:あなたにもサブ文字列マッチをを返すfind()を使用している

  • 上記のため、「関数」の前に「関数」がないため、「関数」が一致します。
    正規表現が にスペースが含まれていなかったため、文字列全体が一致しませんでした。代わりに否定先読みで

使用Mathcher#matches()または^$アンカー:

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

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