我有以下的正则表达式(我的实际正则表达式实际上是一个复杂得多,但我牵制我的问题这一点):\s(?<number>123|456)\s
正则表达式不返回所有匹配
而且下面的测试数据:
“123 456”
如预期的/想要的结果我会在2个匹配的正则表达式匹配之一与“号码”是“123”和第二个号码是“456”。不过,我只得到1个匹配,“数字”是“123”。
我也注意到,在测试数据确实给2场比赛在增加“123”恩“456”之间的另一空间...
为什么我没有得到我想要的结果呢?如何解决它?
我有以下的正则表达式(我的实际正则表达式实际上是一个复杂得多,但我牵制我的问题这一点):\s(?<number>123|456)\s
正则表达式不返回所有匹配
而且下面的测试数据:
“123 456”
如预期的/想要的结果我会在2个匹配的正则表达式匹配之一与“号码”是“123”和第二个号码是“456”。不过,我只得到1个匹配,“数字”是“123”。
我也注意到,在测试数据确实给2场比赛在增加“123”恩“456”之间的另一空间...
为什么我没有得到我想要的结果呢?如何解决它?
您的模式包含消费\s
与数字前后的空白匹配的模式,并且输入包含连续的数字,用单个空格分隔。如果数字之间有两个空格,它将起作用。
使用基于lookarounds空白界限:
(?<!\S)(?<number>123|456)(?!\S)
的(?<!\S)
是负回顾后,将失败的比赛,如果有一个非空白字符立即向左当前位置(?!\S)
是一个负面预测,如果当前位置的右边立即有非空白字符,则匹配将失败。
(?<!\S)
与(?<=^|\s)
相同,而(?!\S)
与(?=$|\s)
相同,但效率更高。
注意,在很多情况下,你甚至可以用1个向前看去,并使用
\s(?<number>123|456)(?!\S)
它将确保连续的空格分隔找到匹配。
感谢您的帮助!正确的答案和很好的解释 – ADE
你在用什么语言? – TheSolider
@TheSolider有一个PCRE标签。 –