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. 你应该张贴你的答案。比现在的好。