2017-07-26 83 views
2

我有以下的正则表达式(我的实际正则表达式实际上是一个复杂得多,但我牵制我的问题这一点):\s(?<number>123|456)\s正则表达式不返回所有匹配

而且下面的测试数据:

“123 456”

如预期的/想要的结果我会在2个匹配的正则表达式匹配之一与“号码”是“123”和第二个号码是“456”。不过,我只得到1个匹配,“数字”是“123”。

我也注意到,在测试数据确实给2场比赛在增加“123”恩“456”之间的另一空间...

为什么我没有得到我想要的结果呢?如何解决它?

+0

你在用什么语言? – TheSolider

+0

@TheSolider有一个PCRE标签。 –

回答

2

您的模式包含消费\s与数字前后的空白匹配的模式,并且输入包含连续的数字,用单个空格分隔。如果数字之间有两个空格,它将起作用。

使用基于lookarounds空白界限:

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

regex demo

(?<!\S)是负回顾后,将失败的比赛,如果有一个非空白字符立即向当前位置(?!\S)是一个负面预测,如果当前位置的右边立即有非空白字符,则匹配将失败。

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

注意,在很多情况下,你甚至可以用1个向前看去,并使用

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

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

+1

感谢您的帮助!正确的答案和很好的解释 – ADE