正则表达式不返回所有匹配

时间:2017-07-26 09:03:13

标签: regex pcre regex-group

我有以下正则表达式(我的实际正则表达式实际上要复杂得多,但我把问题归结为此):\s(?<number>123|456)\s

以下测试数据:

  

&#34; 123 456&#34;

正如预期/想要的结果一样,我将在2场比赛中获得正则表达式匹配,其中#&#34;数字&#34;正在&#34; 123&#34;第二个数字为&#34; 456&#34;。但是,我只能与#34;#&#34;匹配。正在&#34; 123&#34;。

我注意到在&#34; 123&#34;之间增加了另一个空格。 en&#34; 456&#34;在测试数据中确实给出了2个匹配...

为什么我没有得到我想要的结果?如何做到对不对?

1 个答案:

答案 0 :(得分:2)

您的模式包含消耗\s模式,这些模式与数字前后的空格匹配,输入包含用单个空格分隔的连续数字。如果数字之间有两个空格,那就可以了。

根据外观使用空白边界:

(?<!\S)(?<number>123|456)(?!\S)

请参阅regex demo

如果当前位置的 left 有一个非空格字符,则(?<!\S)是一个负面的后观,会使匹配失败,而(?!\S)是一个如果当前位置的右侧有一个非空白字符,则会使匹配失败的否定前瞻。

(?<!\S)(?<=^|\s)相同,(?!\S)(?=$|\s)相同,但效率更高。

请注意,在许多情况下,您甚至可以使用1个预测并使用

\s(?<number>123|456)(?!\S)

它将确保找到连续的空白分隔匹配。