我正在尝试捕获字符串中的一个或多个变量,而不仅仅是找到的第一个值。我创建了一个测试正则表达式
color.*?(?<COLOR>(red|blue|black)).*?.
和测试句
favorite colors are red, blue and black. Mr. Green
可以在这里看到http://regex101.com/r/vV7bP3/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)[^\.]*