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

时间:2018-11-29 13:34:12

标签: java regex negative-lookahead

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

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

  • 找到子字符串“ AAA”,“ BBB”,“ CCC”,但
  • 忽略字符串中的子字符串“ DDD”,“ EEE”或“ FFF”。

我尝试了类似(?!DDD | EEE | FFF)(AAA | BBB | CCC)的操作,但未成功。

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

谢谢!

1 个答案:

答案 0 :(得分:1)

我想到了这个:

(?!.*?(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).*$