正则表达式多重否定前瞻

时间:2013-01-28 12:16:39

标签: java regex

这是我的正则表达式模式:[Ss]ection\s\d+(?![a-zA-z])(?!</ref>)

例如,它应匹配:section 5section 50

例如,它应该匹配:section 5Asection 5</ref>section 5A</ref>section 50A

问题在于,实际上它与错误匹配:http://regexr.com?33ien

虽然不确定该模式有什么问题......

3 个答案:

答案 0 :(得分:8)

也许试试[Ss]ection\s\d++(?![a-zA-z])(?!</ref>)。 ++是possessive quantifier。这个量词类似于贪婪量词,除了它阻止它与正则表达式的后续部分使用时匹配的字符串片段。

示例

System.out.println("ababab".matches("(ab)++ab")); 
// prints false since last "ab" is possessed by (ab)++ 

答案 1 :(得分:2)

匹配没有错:在你的正则表达式中,你想要“section”后跟一个或多个数字后跟一些文字或“”

这对section 50A来说是真的:

section 5之后是0A,这不是你的负面预测。

您可以执行以下操作:

[Ss]ection\s\d+(?![a-zA-Z0-9])(?!</ref>)

答案 2 :(得分:1)

这个应该有效:

[Ss]ection\s\d+(?!\d)(?![a-zA-z])(?!</ref>)

我已经在Strangeness with negative lookahead assertion in Java regular expression解释了我们对regexp前瞻的思考问题,它也适用于此。

这里的情况略有不同:当我们不想要它时,负向前瞻确实匹配,因为匹配器倾向于接受预先预测部分的较短匹配,如果它有助于匹配表达式整体< / em>的。这就是为什么在使用前瞻时理解输入边界很重要的原因:无论是单词边界,锚$,还是关于以下文本的某些断言(不看数字在我提出的解决方案中)。