我需要扫描日志文件以找到一些子字符串。
如何在单个正则表达式中组合以下条件:
我尝试了类似(?DDD | EEE | FFF)(AAA | BBB | CCC)的东西,但没有成功。
Java模式类应该支持正则表达式语法。
非常感谢。
我想到了这个:
(?!.*?(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).*$