如何使 \w 令牌在此正则表达式中表现得非贪婪?

问题描述 投票:0回答:1

我有一个文本字符串,其中包含重复模式,每个重复与下一个重复由

.
(点)字符分隔。模式
may
_123
结尾(下划线后跟一系列数字),我想在专用捕获组中捕获这些数字。

我构建的 RegEx (ECMAScript) 大部分都有效:
https://regex101.com/r/iEzalU/1

/(label(:|\+))?(\w+)(?:_(\d+))?/gi

但是,

(\w+)
部分表现得贪婪,并且超过了
(?:_(\d+))?
部分。

Regex with Greedy behavior

添加

?
使
\w+
非贪婪
(\w+?)
有效,但现在我为与
\w

匹配的每个字符都有一个捕获标记

Regex with non-greedy behavior

我怎样才能使这个正则表达式使得

\w+
表现得贪婪,但仍然不超过
_(\d+)
部分?
否则,是否可以捕获非贪婪
\w+?
匹配的所有标记作为单个匹配? (一些捕获/非捕获组魔法?)

javascript regex non-greedy
1个回答
0
投票

创建正则表达式时,最好考虑预期的匹配边界。

您知道需要匹配较长字符串中的子字符串,因此可以立即排除

$
\z
。数字、字母、下划线都是与
\w
匹配的单词字符,因此您希望将所有字符匹配到单词字符以外的字符(或者可能匹配到字符串末尾)。

我建议使用

(label[:+])?(\w+?)(?:_(\d+))?\b

查看正则表达式演示

详情

  • (label[:+])?
    - 可选的第 1 组:
    label
    ,然后是
    :
    +
  • (\w+?)
    - 第 2 组:一个或多个尽可能少的单词字符
  • (?:_(\d+))?
    - 可选序列:
    _
    ,然后捕获到第 3 组中的一个或多个数字
  • \b
    - 下一个字符只能是非单词字符,或者后面应该是字符串结尾。
© www.soinside.com 2019 - 2024. All rights reserved.