正则表达式懒惰量词

Des*_*901 5 regex

我有这样一句话

a something* q b c w
Run Code Online (Sandbox Code Playgroud)

我必须匹配aq一样

(id_1: a, id_2: q)
Run Code Online (Sandbox Code Playgroud)

b独自喜欢

(id_1: b)
Run Code Online (Sandbox Code Playgroud)

cw一样(id_1:c id_2:w)

我试着用这个正则表达式

(?:\b(?P<id_1>a|b|c)\b(?:.*?)(?P<id_2>q|w)?\b)
Run Code Online (Sandbox Code Playgroud)

因为懒惰的算子.*?正则表达式只匹配句子的第一部分,仅匹配

(id_1: a, id_1: b, id_1: c)
Run Code Online (Sandbox Code Playgroud)

实例

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

(?:\b(?P<id_1>a|b|c)\b(?:.*)(?P<id_2>q|w)?\b)
Run Code Online (Sandbox Code Playgroud)

实例

它匹配

(id_1: a)
Run Code Online (Sandbox Code Playgroud)

之后的所有内容都匹配为.*.

如果第二部分是强制性的(懒惰的话.*):

(?:\b(?P<id_1>a|b|c)\b(?:.*?)(?P<id_2>q|w)\b)
Run Code Online (Sandbox Code Playgroud)

实例

它匹配句子

(id_1: a, id_2: q);(id_1: b, id_2: w)
Run Code Online (Sandbox Code Playgroud)

正如所料.

它可以使用正则表达式"更喜欢"匹配整个句子(包括选装件)或只有第一部分匹配ONLY如果可选的一个缺失.

编辑: 对不起,提供的正则表达式中有一些错误.

最后一个正则表达式是:

(?:\b(?P<id_1>a|b|c)\b(?:.*?)(?P<id_2>q|w)\b)
Run Code Online (Sandbox Code Playgroud)

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

(id_1: a , id_2: w) ; (id_1: a, id_2: none) ; (id_1:a , id_2: w)
Run Code Online (Sandbox Code Playgroud)

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

(?:\b(?P<id_1>a|b|c)\b(?:.*?)(?P<id_2>q|w)?\b)
Run Code Online (Sandbox Code Playgroud)

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

我还更新了所有实例.

Wik*_*żew 1

惰性点匹配是问题的根本原因,因为它需要存在尾随边界。

如果您需要匹配一些非特定文本的文本,您可以使用两种东西:要么是调和的贪婪标记,要么是基于展开循环的正则表达式。

如果您有变量,您可以使用调和的贪婪标记,并使用量词使第二个捕获组可选?

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

请参阅正则表达式演示