2012-03-15 4 views
1

私のjava @windowsは次のとおりです。java negative lookbehind正規表現のバグ?

java version "1.6.0_29" 
Java(TM) SE Runtime Environment (build 1.6.0_29-b11) 
Java HotSpot(TM) Client VM (build 20.4-b02, mixed mode, sharing) 

コード

Pattern.compile(".+(?<!(xxx|idea|perforator|pycharm|s).*)").matcher("xxx").matches() //returns TRUE while it should return FALSE 
Pattern.compile(".+(?<!(xxx|idea|perforator|pycharm|s).*)").matcher("perforator").matches() //returns FALSE 

文字列が8つの文字より小さい場合、負の後読みが失敗したように見えます。

これはバグですか、正規表現について誤解していますか?

+0

何をしますか? lookbehindが成功するまで最初の '。+'はバックトラックしますので、両方の行が一致するはずです。 – Qtax

+1

@Qtax Javaマッチャーの永遠に疑問を引き起こす 'matches()'メソッドは、式が入力文字列全体をマッチとして取得する場合にのみ成功します。 – Affe

答えて

0

あなたが使用することができます(大きな式の一部として)いくつかの単語を含まない部分文字列と一致する必要がある場合一致の結果を逆転するだけです:

xxx|idea|perforator|pycharm|s