几个小时以来一直在摆弄这个......
我正在尝试解析这种形式的错误消息:
[error] C:\Me\MyPath\myFile.scala:18:22: not found: value getaa
我可以使用以下正则表达式很好地做到这一点:
\[(error|warn)\]\s+(.+):(\d+):(?:\d+:)\s+(.+)$
正确生成组:
error
C:\Me\MyPath\myFile.scala
18
not found: value getaa
但为了使其更健壮,我需要将 22:
部分设为可选(因为某些版本的 scala 编译器不输出列号)。换句话说,它也需要为这个字符串生成与上面相同的组:
[error] C:\Me\MyPath\myFile.scala:18: not found: value getaa
我试过在可选组后面加上一个问号,但这不起作用——它弄乱了原来的组。我假设有一些关于懒惰与贪婪的东西我不理解。 Here is a working sample在正则表达式 101 上。感谢您的帮助。
最佳答案
需要加两个问号:
\[(error|warn)\]\s+(.+?):(\d+):(?:\d+:)?\s+(.+)$
^ ^
查看 regex demo
.+?
将匹配除换行符以外的任何 1+ 个字符尽可能少,因此匹配到子模式的第一次出现跟随。第二个 ?
将使 (?:\d+:)
组可选。
完整的模式细节
\[
- 一个[
(error|warn)
- 两个子字符串之一(error
或warn
)\]
- 或者只是]
- 一个]
字符\s+
- 1+ 个空格(.+?)
- 除换行字符外的任何 1+ 个字符,尽可能少,直到第一个...:
- 冒号(\d+)
- 第 2 组:一个或多个数字:
- 冒号(?:\d+:)?
- 一个非捕获组匹配 1 个以上的数字和一个冒号在它们之后 1 次或 0 次\s+
- 1+ 个空格(.+)
- 第 3 组:行的其余部分$
- 字符串结尾(注意这里没有必要,因为.+
是一个贪婪的子模式)
关于正则表达式可选组解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45824778/