正则表达式懒惰量词

时间:2015-12-07 10:06:48

标签: regex

我有这样的句子

a something* q b c w

我必须将 a q 匹配在一起

(id_1: a, id_2: q)
单独

b

(id_1: b)

c w 一样喜欢     (id_1:c id_2:w)

我尝试使用此正则表达式

(?:\b(?P<id_1>a|b|c)\b(?:.*?)(?P<id_2>q|w)?\b)

由于懒惰的运算符。*?,正则表达式仅匹配句子的第一部分,仅匹配

(id_1: a, id_1: b, id_1: c)

Live Example

如果我们使用贪婪的运算符使表达式变为

(?:\b(?P<id_1>a|b|c)\b(?:.*)(?P<id_2>q|w)?\b)

Live Example

匹配

(id_1: a)

后面的所有内容都匹配为。*

如果第二部分是强制性的(在。* 上是懒惰的):

(?:\b(?P<id_1>a|b|c)\b(?:.*?)(?P<id_2>q|w)\b)

Live Example

匹配

之类的句子
(id_1: a, id_2: q);(id_1: b, id_2: w)

正如所料。

可以使用“首选”匹配整个句子(包括可选部分)或仅匹配第一部分 ONLY 的正则​​表达式(如果缺少可选部分)。

修改 抱歉,提供的正则表达式中有一些错误。

最后一个正则表达式是:

(?:\b(?P<id_1>a|b|c)\b(?:.*?)(?P<id_2>q|w)\b)

并且它要求两个组都是强制性的。它匹配“某事物* w”,但它与“某物*”或“a”不匹配。我需要匹配“某事* w”以及“a”和“a w”并分别获得匹配组:

(id_1: a , id_2: w) ; (id_1: a, id_2: none) ; (id_1:a , id_2: w)

我认为所需的正则表达式是:

(?:\b(?P<id_1>a|b|c)\b(?:.*?)(?P<id_2>q|w)?\b)

但在句子“a something * w”中它只匹配“a”(由于。*上的懒惰运算符)。

我还更新了所有实例。

1 个答案:

答案 0 :(得分:1)

延迟点匹配是一个问题根本原因,因为它需要存在尾随边界。

如果您需要匹配某些非特定文字的文字,您可以使用以下两项内容:淬火贪婪令牌或基于unroll-the-loop的正则表达式。

如果您有变量,可以使用tempered greedy token并使用?量词使第二个捕获组可选:

\b(?P<id_1>a|b|c)\b(?:(?!\b(?:a|b|c|q|w)\b).)*(?P<id_2>q|w)?\b
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^             ^

请参阅regex demo