Java 正则表达式多重负前瞻
这是我的正则表达式模式:Java 正则表达式多重负前瞻,java,regex,Java,Regex,这是我的正则表达式模式:[Ss]section\s\d+(?![a-zA-z])(?!) 例如,它应该匹配:第5节或第50节 例如,它应该不匹配:第5A节或第5节或第5A节或第50A节 问题是,在现实中,它与它们的匹配是错误的: 但不确定该模式有什么问题…此模式应该可以: [Ss]ection\s\d+(?!\d)(?![a-zA-z])(?!</ref>) [Ss]section\s\d+(?!\d)(?![a-zA-z])(?!) 我已经解释了关于regexp lookahe
[Ss]section\s\d+(?![a-zA-z])(?!)
例如,它应该匹配:第5节
或第50节
例如,它应该不匹配:第5A节或第5节或第5A节或第50A节
问题是,在现实中,它与它们的匹配是错误的:
但不确定该模式有什么问题…此模式应该可以:
[Ss]ection\s\d+(?!\d)(?![a-zA-z])(?!</ref>)
[Ss]section\s\d+(?!\d)(?![a-zA-z])(?!)
我已经解释了关于regexp lookaheads的一个问题,它在这里也适用
这里的情况稍有不同:负前瞻确实在我们不希望它匹配时匹配,因为匹配器倾向于接受前前瞻部分的较短匹配,如果它有助于匹配整个表达式。这就是为什么如果你使用lookahead,对输入边界有一个概念是很重要的:无论是单词边界、锚点$
,还是关于以下文本的一些断言(不看我建议的解决方案中的数字)。匹配没有错:在你的正则表达式中,你想要“section”后跟一个或多个数字,后面不跟某些文本或“”
这对于第50A节来说是正确的:
第5节
后面紧跟着0A
,这并不在你的负面展望中
您可以执行以下操作:
[Ss]ection\s\d+(?![a-zA-Z0-9])(?!</ref>)
[Ss]section\s\d+(?![a-zA-Z0-9])(?!)
也许可以试试[Ss]section\s\d++(?![a-zA-z])(?!)
++是这个量词和贪婪的量词相似,只是它阻止匹配的字符串片段被正则表达式的后面部分使用
范例
System.out.println("ababab".matches("(ab)++ab"));
// prints false since last "ab" is possessed by (ab)++
[Ss]section\s\d++(?![a-zA-z])(?!)
解决了你的问题吗?@Pshemo:\d++
做什么?@jlordo\d++
是一个注释。@Pshemo:你能把这个注释作为答案发表吗please@Pshemo. 你应该张贴你的答案。比现在的好。