我有以下正则表达式(我的实际正则表达式实际上要复杂得多,但我把问题归结为此):\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个匹配...
为什么我没有得到我想要的结果?如何做到对不对?
答案 0 :(得分:2)
您的模式包含消耗\s
模式,这些模式与数字前后的空格匹配,输入包含用单个空格分隔的连续数字。如果数字之间有两个空格,那就可以了。
根据外观使用空白边界:
(?<!\S)(?<number>123|456)(?!\S)
请参阅regex demo
如果当前位置的 left 有一个非空格字符,则(?<!\S)
是一个负面的后观,会使匹配失败,而(?!\S)
是一个如果当前位置的右侧有一个非空白字符,则会使匹配失败的否定前瞻。
(?<!\S)
与(?<=^|\s)
相同,(?!\S)
与(?=$|\s)
相同,但效率更高。
请注意,在许多情况下,您甚至可以使用1个预测并使用
\s(?<number>123|456)(?!\S)
它将确保找到连续的空白分隔匹配。