正则表达式 - 仅在中间部分与某些字符串匹配时匹配

时间:2014-07-04 10:01:17

标签: regex parsing

标题可能听起来有点复杂,所以让我举一个简化的例子。我有一个像这样的测试字符串:

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解析问题,但我将其简化为单独解决问题。

1 个答案:

答案 0 :(得分:2)

您的正则表达式需要进行一些修改:

(?s)A(?:(?!ccc).)*?Z

(?!ccc)是一个负面预测,断言A后面没有ccc。前瞻后的.正在进行所有匹配。它一次在文本中前进一个字符,确保每个位置后面没有ccc

Regex101 Demo