标题可能听起来有点复杂,所以让我举一个简化的例子。我有一个像这样的测试字符串:
A ...
aaa
... Z
A ...
bbb
... Z
A ...
ccc
... Z
A ...
cxc
... Z
A ...
ccc
... Z
A ...
cxc
... Z
如果我想匹配所有A-Z部分,那很容易:
(?s)A.*?Z
如果我想匹配中间没有“c”的所有A-Z部分,那也很容易:
(?s)A[^c]*?Z
但我真正想做的是匹配所有A-Z部分而不是中间的“ccc”。我尝试了先行断言:
(?s)A(?!.*ccc).*?Z
但这只匹配最后一个A-Z部分,因为所有其他人确实在他们之后的某处有“ccc”。
那么,它能以某种方式在一个正则表达式中完成吗?不幸的是,在一步中匹配所有A-Z部分并在第二步中删除带有“ccc”的部分不是一种选择。
您可能怀疑这是一个HTML解析问题,但我将其简化为单独解决问题。
答案 0 :(得分:2)
您的正则表达式需要进行一些修改:
(?s)A(?:(?!ccc).)*?Z
(?!ccc)
是一个负面预测,断言A
后面没有ccc
。前瞻后的.
正在进行所有匹配。它一次在文本中前进一个字符,确保每个位置后面没有ccc
。