匹配正则表达式字符串中的多个值

时间:2014-06-30 16:54:34

标签: regex

我正在尝试捕获字符串中的一个或多个变量,而不仅仅是找到的第一个值。我创建了一个测试正则表达式

color.*?(?<COLOR>(red|blue|black)).*?.

和测试句

favorite colors are red, blue and black.  Mr. Green

可以在这里看到http://regex101.com/r/vV7bP3/2

我的目标是获得一个匹配的红色,蓝色和黑色,而不是绿色,这是在这段时间之后。换句话说,用“颜色”这个词来寻找句子中所有颜色的匹配,但只到下一个时期(我明白这是一个由两部分组成的问题,我认为这比发布两次更容易。

2 个答案:

答案 0 :(得分:3)

要在单词颜色和点之间找到多种颜色,可以在全局搜索中使用此模式(兼容PHP / PCRE,Perl,Ruby 2.0,Java,.NET):

(?:\G(?!\A)|\bcolors?\b)[^.]+?\b(?<colors>red|bl(?:ue|ack))\b

这个想法是使用与最后一个匹配结果的末尾匹配的\G锚点。该技术在模式开始时使用两个入口点(在非捕获组中)。

第一个匹配结果使用单词&#34; color&#34;作为模式的入口点,下一个匹配结果使用带有\G锚点的入口点。

由于[^.]是唯一使用的字符类,因此您无法在点后获得其他结果。 (请注意,这可能会导致Mr.等缩写或U.S.A.等缩写词出现问题

注意:您可以通过在&#34; color&#34;之前添加.*?来减少正则表达式引擎的工作量。 (这样可以避免在&#34;颜色&#34;逐个进入2个入口点之前测试所有字符):

(?:\G(?!\A)|.*?\bcolors?\b)[^.]+?\b(?<colors>red|bl(?:ue|ack))\b

或者您可以在开始时移动单词边界以更快地失败(因为每个匹配以单词边界结束)

\b(?:\G(?!\A)|colors?\b)[^.]+?\b(?<colors>red|bl(?:ue|ack))\b

答案 1 :(得分:0)

您可以尝试使用以下正则表达式来捕获文字.之前的颜色,

color[^\.]*(red|blue|black|Green)[^\.]*(red|blue|black|Green)[^\.]*(red|blue|black|Green)[^\.]*

DEMO