非贪婪正则表达式捕获组语法
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):
- 参考:foo/bar,版本:v1.2.3
- ref: baz/spam, ver: 1.2.3 greedy
为了 match\group 版本(例如 1.2.3)没有前面的文本(例如 greedy)?
由于您在最后一个捕获组中使用了 .*
,因此它会匹配第二个捕获组中直到行尾的所有内容。
您可以通过使用 \S
(与 \s
相反,它匹配除空格以外的任何字符)将正则表达式的匹配限制为仅匹配非空白字符:
^\s*key: (?<ref>[^:]+):(?<ver>\S+)
另请注意在第一个捕获组中使用取反字符 class [^:]
以减少与 :
.
以外的任何字符匹配的回溯
匹配版本号的另一个选项是用一个可选的 v
字符匹配由点分隔的数字。
^\s*key: (?<ref>[^:]+):(?<ver>v?\d+(?:\.\d+)*)\b
^
字符串开头
\s*key:
匹配可选的空白字符和 key:
(?<ref>[^:]+)
捕获组 ref
匹配 :
以外的 1+ 个字符
:v?
匹配:
和可选v
(?<ver>
捕获组 ver
\d+(?:\.\d+)*
匹配 1+ 个数字并可选择重复点和数字
)
关闭群组ver
\b
一个单词边界
给定以下文本
key: foo/bar:v1.2.3
key: baz/spam:1.2.3 greedy
我试过以下正则表达式:
^\s*key: (?<ref>.*?):(?<ver>.*)
其中 returns 以下组 (demo):
- 参考:foo/bar,版本:v1.2.3
- ref: baz/spam, ver: 1.2.3 greedy
为了 match\group 版本(例如 1.2.3)没有前面的文本(例如 greedy)?
由于您在最后一个捕获组中使用了 .*
,因此它会匹配第二个捕获组中直到行尾的所有内容。
您可以通过使用 \S
(与 \s
相反,它匹配除空格以外的任何字符)将正则表达式的匹配限制为仅匹配非空白字符:
^\s*key: (?<ref>[^:]+):(?<ver>\S+)
另请注意在第一个捕获组中使用取反字符 class [^:]
以减少与 :
.
匹配版本号的另一个选项是用一个可选的 v
字符匹配由点分隔的数字。
^\s*key: (?<ref>[^:]+):(?<ver>v?\d+(?:\.\d+)*)\b
^
字符串开头\s*key:
匹配可选的空白字符和key:
(?<ref>[^:]+)
捕获组ref
匹配:
以外的 1+ 个字符
:v?
匹配:
和可选v
(?<ver>
捕获组ver
\d+(?:\.\d+)*
匹配 1+ 个数字并可选择重复点和数字
)
关闭群组ver
\b
一个单词边界