如何创建具有多个条件的正则表达式
How to create regex with multiple conditions
我需要扫描日志文件以找到一些子字符串。
如何在单个正则表达式中组合以下条件:
- 查找子字符串 "AAA"、"BBB"、"CCC" 但
- 在子字符串中忽略它们 "DDD","EEE" 或 "FFF" 出现在字符串中。
我尝试了类似 (?!DDD|EEE|FFF)(AAA|BBB|CCC) 的方法,但没有成功。
Java 模式 class 应支持正则表达式语法。
谢谢!
我想到了这个:
(?!.*?(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).*$
我需要扫描日志文件以找到一些子字符串。
如何在单个正则表达式中组合以下条件:
- 查找子字符串 "AAA"、"BBB"、"CCC" 但
- 在子字符串中忽略它们 "DDD","EEE" 或 "FFF" 出现在字符串中。
我尝试了类似 (?!DDD|EEE|FFF)(AAA|BBB|CCC) 的方法,但没有成功。
Java 模式 class 应支持正则表达式语法。
谢谢!
我想到了这个:
(?!.*?(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).*$