正则表达式可选组解析

标签 regex

几个小时以来一直在摆弄这个......

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

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

关于正则表达式可选组解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45824778/

相关文章:

python - Pandas :替换字典中的完整匹配字符串

python - 如何在Python正则表达式中搜索至少两个组之一,同时还要寻找必须的第三组?

Python 数学正则表达式

regex - 从副标题中删除计数行

c# - 按最长的正则表达式匹配子字符串拆分

c# - 希伯来语、英语、符号的正则表达式

regex - 如何从shell中的字符串中检索url?

regex - git 使用什么风格的正则表达式

javascript - JavaScript 中的正则表达式 - 替换图像 src 属性

javascript - 检测正则表达式中中间有或没有空格的特定字符串