非贪婪正则表达式捕获组语法

non-greedy regex capture groups syntax

给定以下文本

key: foo/bar:v1.2.3
    key: baz/spam:1.2.3 greedy

我试过以下正则表达式:

^\s*key: (?<ref>.*?):(?<ver>.*)

其中 returns 以下组 (demo):

为了 match\group 版本(例如 1.2.3)没有前面的文本(例如 greedy)?

由于您在最后一个捕获组中使用了 .*,因此它会匹配第二个捕获组中直到行尾的所有内容。

您可以通过使用 \S(与 \s 相反,它匹配除空格以外的任何字符)将正则表达式的匹配限制为仅匹配非空白字符:

^\s*key: (?<ref>[^:]+):(?<ver>\S+)

另请注意在第一个捕获组中使用取反字符 class [^:] 以减少与 :.

以外的任何字符匹配的回溯

RegEx Demo

匹配版本号的另一个选项是用一个可选的 v 字符匹配由点分隔的数字。

^\s*key: (?<ref>[^:]+):(?<ver>v?\d+(?:\.\d+)*)\b
  • ^ 字符串开头
  • \s*key: 匹配可选的空白字符和 key:
  • (?<ref>[^:]+) 捕获组 ref 匹配 :
  • 以外的 1+ 个字符
  • :v?匹配:和可选v
  • (?<ver> 捕获组 ver
    • \d+(?:\.\d+)* 匹配 1+ 个数字并可选择重复点和数字
  • )关闭群组ver
  • \b一个单词边界

Regex demo