正则表达式 - 如何将文本与模式前瞻相匹配

时间:2018-02-21 12:39:05

标签: regex

标题可能令人困惑,但我想要实现的目标:

我有字符串:

14:00:01 | some text XXCODE <some text> 
some text 
] 
14:00:02 | some text <some text> XXCODE error 
sometext
]
14:00:03 | some text XXCODE <some text> 
some text
and more text 412432 
]

我想匹配以14:00开头的文字,字符串为XXCODE,并以第一个括号]结尾,并且在此括号文字error之前的任意位置

所以在上面的例子中,我想匹配:

14:00:02 | some text <some text> XXCODE error 
sometext
]

我尝试使用正则表达式:/14\:00(?=.*?error).*?XXCODE.*?\n]/gs

但没有成功,因为它也匹配第一次没有“错误”。如何在我的匹配中匹配以上与前瞻?有可能吗?

2 个答案:

答案 0 :(得分:2)

您可以使用以下模式:

sed

为了在每个行的开头匹配,请确保将多行标记传递给正则表达式编译器(除非您在文本编辑器中使用它,如Notepad ++,基于行的工具,如{{ 1}}或Ruby,其中^已经与行的开头匹配。)

请参阅regex demo

<强>详情

  • ^ - 一行的开头(与多线修改器一起使用时)
  • 14:00\b - 整个单词的14:00
  • [^]]* - 除]
  • 以外的0个字符
  • XXCODE - 文字XXCODE子字符串
  • [^]]* - 除]
  • 以外的0个字符
  • error - 文字error子字符串
  • [^]]* - 除]
  • 以外的0个字符
  • ] - ]字符。

如果上次结算]必须位于单独的一行,您可以使用

^14:00\b[^]]*XXCODE[^]]*error.*\r?\n(?:(?!]$).*\r?\n)*]$

请参阅this regex demo

此处,感兴趣的是.*\r?\n(?:(?!]$).*\r?\n)*]$部分:

  • .*\r?\n - 匹配第一行的其余部分
  • (?:(?!]$).*\r?\n)* - 匹配0+序列:
    • (?!]$) - 在新行开始后的行尾不能有]
    • .*\r?\n - 其余部分
  • ]$ - 在该行的末尾匹配]

如果error可能在XXCODE之前,请使用替换:

^14:00\b[^]]*(?:XXCODE[^]]*error|error[^]]*XXCODE)[^]]*]

请参阅another regex demo

答案 1 :(得分:1)

由于error可能会出现在XXCODE之前,您需要使用外观来查看但不要使用:

^14:00(?=[^]]*error)[^]]*XXCODE[^]]*\]

RegEx细分

^14:00  # Match lines beginning with 14:00
(?= # Construct a positive lookahead
    [^]]*error # That looks for `error` wherever possible before `]`
)   # End of lookahead
[^]]*XXCODE[^]]*\] # Match rest up to a `]` should include `XXCODE`

Live demo