已经摆弄这个几个小时了......
我正在尝试解析这种形式的错误消息:
[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 的工作示例。谢谢你的帮助。
需要加上两个问号:
\[(error|warn)\]\s+(.+?):(\d+):(?:\d+:)?\s+(.+)$
^ ^
Run Code Online (Sandbox Code Playgroud)
查看正则表达式演示
将尽可能少地.+?匹配除换行符之外的任何 1+ 个字符,因此将匹配随后出现的子模式的第一次出现。第二个将使组成为可选的。?(?:\d+:)
完整图案细节
\[ - A[(error|warn)- 两个子字符串之一 (error或warn)\]- 或者只是]- 一个]字符\s+- 1+ 空格(.+?)- 除换行符之外的任何 1+ 个字符,尽可能少,直到第一个...:- 一个冒号(\d+)- 第 2 组:一位或多位数字:- 一个冒号(?:\d+:)?- 一个非捕获组匹配 1+ 位数字以及其后的冒号 1 或 0 次\s+- 1+ 空格(.+)- 第 3 组:生产线的其余部分$- 字符串结尾(请注意,这里没有必要,因为它.+是一个贪婪的子模式)