这是我的正则表达式模式:[Ss]ection\s\d+(?![a-zA-z])(?!</ref>)
例如,它应该匹配:section 5
或section 50
例如,它不应该匹配:section 5A
or section 5</ref>
or section 5A</ref>
orsection 50A
问题是实际上它匹配错误:http ://regexr.com?33ien
虽然不知道模式有什么问题......
这是我的正则表达式模式:[Ss]ection\s\d+(?![a-zA-z])(?!</ref>)
例如,它应该匹配:section 5
或section 50
例如,它不应该匹配:section 5A
or section 5</ref>
or section 5A</ref>
orsection 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 50A
:
section 5
紧随其后0A
,这不在您的负面预测中。
您可以执行以下操作:
[Ss]ection\s\d+(?![a-zA-Z0-9])(?!</ref>)
这个应该工作:
[Ss]ection\s\d+(?!\d)(?![a-zA-z])(?!</ref>)
我已经解释了我们对 Strangeness 的正则表达式前瞻的思考问题,以及 Java 正则表达式中的负前瞻断言,它也适用于这里。
这里的情况略有不同:当我们不希望它匹配时,负前瞻确实匹配,因为匹配器倾向于接受预前瞻部分的较短匹配,如果它有助于匹配整个表达式。这就是为什么在使用前瞻时了解输入边界很重要的原因:无论是单词边界、锚点$
还是关于以下文本的某些断言(在我提出的解决方案中不看数字)。