java负面lookbehind正则表达式bug?

时间:2012-03-15 19:59:41

标签: java regex

我的java @windows是:

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个字符,则看起来负面的lookbehind会失败。

是错误还是我误解了正则表达式?

2 个答案:

答案 0 :(得分:4)

Java中的Lookbehinds不能包含.*这样的可变长度的东西,只有像交替和有限重复这样的东西。

更多信息:http://www.regular-expressions.info/lookaround.html#limitbehind

答案 1 :(得分:0)

如果您需要匹配不包含某些单词的子串(作为更大表达式的一部分),您可以使用:

(?s:(?!xxx|idea|perforator|pycharm|s).)*

如果这是您唯一要做的事情,只需反转匹配结果:

xxx|idea|perforator|pycharm|s