正则表达式可选组解析

thu*_*und 4 regex

已经摆弄这个几个小时了......

我正在尝试解析这种形式的错误消息:

[error]  C:\Me\MyPath\myFile.scala:18:22: not found: value getaa
Run Code Online (Sandbox Code Playgroud)

我可以使用以下正则表达式来完成此操作:

\[(error|warn)\]\s+(.+):(\d+):(?:\d+:)\s+(.+)$
Run Code Online (Sandbox Code Playgroud)

哪个正确产生组:

error
C:\Me\MyPath\myFile.scala
18
not found: value getaa
Run Code Online (Sandbox Code Playgroud)

但为了使其健壮,我需要将该22:部分设为可选(因为某些版本的 scala 编译器不输出列号)。换句话说,它也需要为此字符串生成与上面相同的组:

[error]  C:\Me\MyPath\myFile.scala:18: not found: value getaa
Run Code Online (Sandbox Code Playgroud)

我尝试在可选组后面加一个问号,但这不起作用 - 它弄乱了原始组。我认为有一些关于懒惰与贪婪的东西我不理解。这是 regex101 的工作示例。谢谢你的帮助。

Wik*_*żew 5

需要加上两个问号:

\[(error|warn)\]\s+(.+?):(\d+):(?:\d+:)?\s+(.+)$
                      ^                ^
Run Code Online (Sandbox Code Playgroud)

查看正则表达式演示

尽可能少地.+?匹配除换行符之外的任何 1+ 个字符,因此将匹配随后出现的子模式的第一次出现。第二个将使组成为可选的。?(?:\d+:)

完整图案细节

  • \[ - A[
  • (error|warn)- 两个子字符串之一 (errorwarn)
  • \]- 或者只是]- 一个]字符
  • \s+- 1+ 空格
  • (.+?)- 除换行符之外的任何 1+ 个字符,尽可能少,直到第一个...
  • :- 一个冒号
  • (\d+)- 第 2 组:一位或多位数字
  • :- 一个冒号
  • (?:\d+:)?- 一个非捕获组匹配 1+ 位数字以及其后的冒号 1 或 0 次
  • \s+- 1+ 空格
  • (.+)- 第 3 组:生产线的其余部分
  • $- 字符串结尾(请注意,这里没有必要,因为它.+是一个贪婪的子模式)