事件匹配的正则表达式帮助是唯一的,虽然模式是相同的

时间:2017-06-30 08:54:49

标签: regex

这是我的正则表达式: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,它应该与重复字符串不匹配。

我正在尝试的是基于此固定字符串从多行中断事件,因为一个事件可以有多个字符串,我希望能够通过第一个匹配字符串将其分解并将其余部分留在事件中。

1 个答案:

答案 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} - :,数字,数字
  • 的2个序列
  • \. - 一个点
  • \d{3} - 三位数