代码之家  ›  专栏  ›  技术社区  ›  Maksim Golendukhin

如果符号不存在,则查找或默认正则表达式

  •  0
  • Maksim Golendukhin  · 技术社区  · 2 年前

    我有这个正则表达式

    ^\d+(?<=\d)_?(?=\d)\d*
    

    我最初的目标是匹配这些模式:

    • 5
    • 55
    • 5_5
    • 55_5

    但是忽略

    • _5
    • 5_
    • _

    据我所知,它至少与行首的1个数字匹配,如果它被数字包围,则为0。很简单。所以

    • 5_5 通过了,
    • 555_555 也通过了,
    • _5 预计不会通过,
    • _ 也没有通过。

    此外, 55 也通过了,这很好。

    但出于某种原因 5. 也没有通过。为什么?它是个位数,即使以后没有下划线符号,也必须通过。知道为什么会这样吗?谢谢

    测试 https://regex101.com/

    1 回复  |  直到 2 年前
        1
  •  1
  •   The fourth bird    2 年前

    原因是,图案应至少匹配两位数字。

    这是由于 ^\d+ 在右边再加一个数字 (?=\d)

    在您的模式中,您可以删除lookaround断言,因为您也在匹配要断言的数字,所以它们是冗余的。

    你的模式可以写成 ^\d+_?\d+ 在这里,你可以看到你必须用可选的下划线匹配至少两个数字。


    要获得所需的当前匹配项,可以将模式编写为:

    ^\d+(?:_\d+)?$
    

    解释

    • ^ 字符串开头
    • \d+ 匹配1+个数字
    • (?:_\d+)? 可选匹配 _ 和1+位数 (以防止结尾出现下划线)
    • $ 结束

    Regex demo