【问题标题】:Regex not returning all matches正则表达式不返回所有匹配项
【发布时间】:2017-07-26 09:03:13
【问题描述】:

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

还有如下测试数据:

“123 456”

正如预期/想要的结果,我将在 2 中匹配正则表达式,其中一个“数字”为“123”,第二个数字为“456”。但是,我只得到 1 个匹配的“数字”为“123”。

我确实注意到,在测试数据的“123”和“456”之间添加另一个空格确实会产生 2 个匹配项...

为什么我没有得到我想要的结果?如何正确处理?

【问题讨论】:

  • 你使用什么语言?
  • @TheSolider 有一个 PCRE 标签。

标签: regex pcre regex-group


【解决方案1】:

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

使用基于环视的空白边界:

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

regex demo

(?&lt;!\S) 是一个否定的lookbehind,如果在当前位置的左边 有一个非空白字符,则匹配失败,(?!\S) 是一个否定的lookahead,它将如果当前位置的右侧有一个非空白字符,则匹配失败。

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

请注意,在许多情况下,您甚至可以使用 1 次前瞻并使用

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

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

【讨论】:

    猜你喜欢
    • 2018-02-18
    • 2021-10-12
    • 2020-12-02
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多