繁体   English   中英

正则表达式多重否定前瞻

[英]Regex Multiple Negative Lookahead

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

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

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

问题是,实际上它与错误相符: http//regexr.com?33ien

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

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

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

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

这对section 50A是正确的:

section 5之后是0A ,那不是你的负向前瞻。

你可以这样做:

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

这应该工作:

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

我已经解释了我们在Strangeness中使用Java正则表达式中的负前瞻断言来考虑regexp前瞻的问题,它也适用于此。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM