【问题标题】:non-greedy regex capture groups syntax非贪婪正则表达式捕获组语法
【发布时间】:2021-08-19 20:10:22
【问题描述】:

给定以下文本

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

我尝试了以下正则表达式:

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

返回以下组 (demo):

  • 参考:foo/bar,版本:v1.2.3
  • ref: baz/spam, ver: 1.2.3 greedy

为了匹配\分组没有前面文本的版本(例如1.2.3),正则表达式中缺少什么(例如greedy)?

【问题讨论】:

标签: regex regex-group


【解决方案1】:

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

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

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

还要注意在第一个捕获组中使用否定字符类 [^:] 以减少匹配除 : 之外的任何字符的回溯。

RegEx Demo

【讨论】:

    【解决方案2】:

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

    ^\s*key: (?<ref>[^:]+):(?<ver>v?\d+(?:\.\d+)*)\b
    
    • ^ 字符串开始
    • \s*key: 匹配可选的空白字符和key:
    • (?&lt;ref&gt;[^:]+) 捕获组 ref 匹配除 @987654329 之外的 1+ 个字符@
    • :v? 匹配 : 和可选的 v
    • (?&lt;ver&gt;抓拍组ver
      • \d+(?:\.\d+)* 匹配 1+ 个数字并可选择重复点和数字
    • )关闭群ver
    • \b一个字边界

    Regex demo

    【讨论】:

      猜你喜欢
      • 2019-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-28
      • 2011-04-27
      • 2010-10-20
      • 2013-02-15
      • 1970-01-01
      相关资源
      最近更新 更多