这是我的正则表达式:https://regex101.com/r/g56UzY/1
我有这种模式
pdlvkw6v INFO 18:25:03.994 pdlvkw6v WARN 18:25:03.994 pdlvkw6v INFO
18:25:03.994 rg9n9bz7 INFO 18:23:52.987 rg9n9bz7 ERROR 19:23:52.987
rg9n9bz7 INFO 21:23:52.987 5y6n9bz7 WARN 18:23:52.987
我当前的正则表达式是:[\w]{8}\s+(INFO|WARN|ERROR)\s+\d\d:\d\d:\d\d\.\d\d\d
我希望正则表达式只确定第一个唯一的字符串即。 show pdlvkw6v然后它应该显示rg9n9bz7
然后显示5y6n9bz7
,它应该与重复字符串不匹配。
我正在尝试的是基于此固定字符串从多行中断事件,因为一个事件可以有多个字符串,我希望能够通过第一个匹配字符串将其分解并将其余部分留在事件中。
答案 0 :(得分:0)
您需要捕获您感兴趣的单词并添加否定前瞻检查:
(?s)\b(\w{8})\b(?!.*\b\1\b)\s+(?:INFO|WARN|ERROR)\s+\d\d(?::\d\d){2}\.\d{3}
^^^^^^^^^^^^^^^^^^^^^^^
或者,如果不支持(?s)
修饰符:
\b(\w{8})\b(?![\s\S]*\b\1\b)\s+(?:INFO|WARN|ERROR)\s+\d\d(?::\d\d){2}\.\d{3}
请参阅regex demo
<强>解释强>:
(?s)
- 使.
与任何字符匹配的DOTALL修饰符\b
- 字边界(\w{8})
- 第1组:8个字的字符\b
- 字边界(?!.*\b\1\b)
- 如果在0+字符之后立即在当前位置的右侧,匹配失败的负向前瞻,则整个单词等于存储在第1组缓冲区中的单词\s+
- 1+空格(?:INFO|WARN|ERROR)
- 三个子串中的一个\s+
- 1+空格\d\d
- 2位数(?::\d\d){2}
- :
,数字,数字\.
- 一个点\d{3}
- 三位数