【问题标题】:shorter way of a regex正则表达式的较短方式
【发布时间】:2015-08-16 00:46:55
【问题描述】:

这必须只匹配这些数字:110, 220, 330, 440, 550, 660, 770, 880, 990(不包括 000)。这个正则表达式(pcre)有更短的方法吗?

/^(1{2}|2{2}|3{2}|4{2}|5{2}|6{2}|7{2}|8{2}|9{2})0$/

【问题讨论】:

    标签: php regex pcre


    【解决方案1】:

    这是一个应该可以工作的较短的正则表达式:

    /^([1-9])\1[0]$/
    

    它使用对第一个匹配字符的反向引用来匹配第二个。这确保了112233 等模式。

    这里是对 regex101 表达式中使用的字符的解释:

    • ^ 在行首断言位置
    • 第一捕获组([1-9])
      • [1-9] 匹配 1 到 9 范围内的单个字符
    • \1 匹配第一个捕获组最近匹配的相同文本
    • [0] 匹配字符 0 字面意思
    • $ 在行尾断言位置

    你可以在这里测试它: https://regex101.com/r/oV6rE7/1

    【讨论】:

    • 第二个捕获组没用了,去掉。
    • 当然。现已删除。我猜它略微提高了性能,尽管它使解决方案的长度增加了一个字符,因为您需要避免以下 0 并且它不会提高 imo 的可读性。
    • 你是对的,我没有看到由于以下0而产生的歧义。没有捕获组的几种解决方法:regex101.com/r/hH5cZ5/1(版本 1、2、3)
    • 太棒了!我认为 v1 最有意义。更新为使用它。谢谢。
    【解决方案2】:

    你可以使用:

    /\b([1-9])\g{1}0\b/
    

    RegEx Demo

    正则表达式的分解:

    \b      # word boundary
    [1-9]   # match digit 1-9 and group them as captured group #1
    \g{1}   # back-reference to group #1
    0       # match 0
    \b      # word boundary
    

    【讨论】:

    • 1.这与 110 不匹配 2. 你知道我对代码只回答的看法
    • 查看答案中的链接演示。
    • @GavinJackson 哇,不!请看这个答案的第一版:stackoverflow.com/revisions/30592502/1
    • @Rizier123,明白了,请见谅
    • @Rizier123:您忘记了 regex101 测试中的“g”:\{1} => \g{1}
    猜你喜欢
    • 1970-01-01
    • 2016-07-01
    • 2017-09-27
    • 2017-08-11
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多