【发布时间】:2015-12-07 10:06:48
【问题描述】:
我有这样一句话
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)
如果我们使用贪心操作符使得表达式变为
(?:\b(?P<id_1>a|b|c)\b(?:.*)(?P<id_2>q|w)?\b)
匹配
(id_1: a)
后面的所有内容都匹配为 .* .
如果第二部分是强制性的(在 .* 上有惰性):
(?:\b(?P<id_1>a|b|c)\b(?:.*?)(?P<id_2>q|w)\b)
它匹配类似的句子
(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)
并且它要求两个组都是强制性的。它匹配“a something* w”,但不匹配“a something*”或仅匹配“a”。我需要匹配 "a something* 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”(由于 .* 上的惰性运算符)。
我还更新了所有实时示例。
【问题讨论】:
-
您的最后一个正则表达式匹配字符串不是您需要的方式吗?我删除了
b c w并且有一个匹配项。您能否使用 1 个示例来描述您需要在其中匹配的内容以及最接近的正则表达式,缺少什么? -
嗨@stribizhev,感谢您的帮助。我编辑了这个问题,因为表达式中有一些错误。我还在编辑部分提供了一个示例。
-
语言是 Python 还是 PHP?
-
@stribizhev 第二个与我需要的非常相似。稍加修改即可完美运行:\b(?P<id_1>a|b|c)\b(?:(?!\b(?:q|w|a|b|c)\b).)*(?P<id_2>q|w)?\b 如果我在 or 中有几个单词,我担心它的效率。有没有其他方法可以在不重复两次 or 列表的情况下做同样的事情?无论如何,请为您提供帮助。这是蟒蛇
标签: regex