如何创建具有多个条件的正则表达式



我需要扫描日志文件来查找一些子字符串。

如何在单个正则表达式中组合以下条件:

  • 查找子字符串"AAA"、"BBB"、"CCC",但是
  • 忽略字符串中的子字符串"DDD"、"EEE"或"FFF">

我尝试了类似(?!DDD|EEE|FFF((AAA|BBB|CCC(的方法,但没有成功。

Java Pattern类应该支持正则表达式语法。

谢谢!

我想出了一个:

(?!.*?(DDD|EEE|FFF).*?)(?<!(DDD|EEE|FFF))(AAA|BBB|CCC)

使用以下测试用例,它似乎是有效的:

123AAA //matches
123BBB //matches
123CCC //matches
123DDD //no match
123EEE //no match
123FFF //no match
AAADDD //no match
EEEBBB //no match

说明:如果字符串中有"DDD"、"EEE"或"FFF",请不要匹配。

如果匹配子字符串之前有"DDD"、"EEE"或"FFF",则不匹配。(我不知道为什么需要这样做。如果我不考虑,"EEEBBB"会得到匹配,我认为不应该。我需要弄清楚这一点。(


更新:我想我需要负向后看,因为我没有考虑子字符串匹配在行中发生的上下文。

这是一个不需要负面回顾的版本:

(?!^.*?(DDD|EEE|FFF).*?$)(?:^.*?(AAA|BBB|CCC).*?$)

似乎有效,因为我正在考虑整条线。


另一次更新。(不能不管它。(这是优化了一点:

(?!^.*?(?:DDD|EEE|FFF).*$)^.*?(AAA|BBB|CCC).*$

最新更新