我有一个文本字符串,其中包含重复模式,每个重复与下一个重复由
.
(点)字符分隔。模式 may
以 _123
结尾(下划线后跟一系列数字),我想在专用捕获组中捕获这些数字。
我构建的 RegEx (ECMAScript) 大部分都有效:
https://regex101.com/r/iEzalU/1
/(label(:|\+))?(\w+)(?:_(\d+))?/gi
但是,
(\w+)
部分表现得贪婪,并且超过了(?:_(\d+))?
部分。
添加
?
使 \w+
非贪婪 (\w+?)
有效,但现在我为与 \w
匹配的每个字符都有一个捕获标记
我怎样才能使这个正则表达式使得
\w+
表现得贪婪,但仍然不超过 _(\d+)
部分?\w+?
匹配的所有标记作为单个匹配? (一些捕获/非捕获组魔法?)
创建正则表达式时,最好考虑预期的匹配边界。
您知道需要匹配较长字符串中的子字符串,因此可以立即排除
$
和 \z
。数字、字母、下划线都是与 \w
匹配的单词字符,因此您希望将所有字符匹配到单词字符以外的字符(或者可能匹配到字符串末尾)。
我建议使用
(label[:+])?(\w+?)(?:_(\d+))?\b
查看正则表达式演示
详情:
(label[:+])?
- 可选的第 1 组:label
,然后是 :
或 +
(\w+?)
- 第 2 组:一个或多个尽可能少的单词字符(?:_(\d+))?
- 可选序列:_
,然后捕获到第 3 组中的一个或多个数字\b
- 下一个字符只能是非单词字符,或者后面应该是字符串结尾。