提问者:小点点

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


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

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

  • 查找子字符串“AAA”、“BBB”、“CCC”,但

我尝试了类似(?DDD | EEE | FFF)(AAA | BBB | CCC)的东西,但没有成功。

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

非常感谢。


共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).*$