正则表达式不返回所有匹配项
Regex not returning all matches
我有以下正则表达式(我的实际正则表达式实际上要复杂得多,但我将我的问题归结为这个):\s(?<number>123|456)\s
以及以下测试数据:
" 123 456 "
作为 expected/wanted 结果,我将在 2 个匹配项中进行正则表达式匹配,第一个匹配 "number" 为“123”,第二个匹配编号为“456”。但是,我只得到 1 场比赛 "number" 是“123”。
我确实注意到在测试数据的“123”和“456”之间添加另一个 space 确实给出了 2 个匹配...
为什么我得不到我想要的结果?如何正确处理?
您的模式包含使用 \s
匹配数字前后空格的模式,并且输入包含用 单个 空格分隔的连续数字。如果数字之间有两个空格,就可以了。
根据环视使用空白边界:
(?<!\S)(?<number>123|456)(?!\S)
(?<!\S)
是一个负向后视,如果在当前位置的 left 附近有一个非空白字符,则匹配失败,并且 (?!\S)
是一个否定前瞻,如果在当前位置的 右边 附近有一个非空白字符,则匹配失败。
(?<!\S)
与(?<=^|\s)
相同,(?!\S)
与(?=$|\s)
相同,但效率更高。
请注意,在许多情况下,您甚至可以使用 1 个前瞻并使用
\s(?<number>123|456)(?!\S)
它将确保找到连续的空格分隔的匹配项。
我有以下正则表达式(我的实际正则表达式实际上要复杂得多,但我将我的问题归结为这个):\s(?<number>123|456)\s
以及以下测试数据:
" 123 456 "
作为 expected/wanted 结果,我将在 2 个匹配项中进行正则表达式匹配,第一个匹配 "number" 为“123”,第二个匹配编号为“456”。但是,我只得到 1 场比赛 "number" 是“123”。
我确实注意到在测试数据的“123”和“456”之间添加另一个 space 确实给出了 2 个匹配...
为什么我得不到我想要的结果?如何正确处理?
您的模式包含使用 \s
匹配数字前后空格的模式,并且输入包含用 单个 空格分隔的连续数字。如果数字之间有两个空格,就可以了。
根据环视使用空白边界:
(?<!\S)(?<number>123|456)(?!\S)
(?<!\S)
是一个负向后视,如果在当前位置的 left 附近有一个非空白字符,则匹配失败,并且 (?!\S)
是一个否定前瞻,如果在当前位置的 右边 附近有一个非空白字符,则匹配失败。
(?<!\S)
与(?<=^|\s)
相同,(?!\S)
与(?=$|\s)
相同,但效率更高。
请注意,在许多情况下,您甚至可以使用 1 个前瞻并使用
\s(?<number>123|456)(?!\S)
它将确保找到连续的空格分隔的匹配项。