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

标签 java regex negative-lookahead

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

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

  • 查找子字符串“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).*$

关于java - 如何创建具有多个条件的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53540261/

相关文章:

regex - 为什么 Eclipse 在 Mac OSX 上找不到正则表达式?

java - 从 .properties 文件加载消息时出错

java - sqlite 将 Jdn 转换为 unixepoch

java - 使用低通滤波器来计算平均值?

python - re.sub() - 在不使用捕获组的情况下替换为匹配中的文本?

javascript - 在字符串中转义正则表达式

regex - 为什么这个正则表达式前瞻不起作用?

regex - 使用正则表达式进行字符串求反

java - 带有 libgdx : asset not found 的可执行 jar