【问题标题】:How to match exactly 3 digits in PHP's preg_match? [duplicate]如何在 PHP 的 preg_match 中精确匹配 3 位数字? [复制]
【发布时间】:2012-11-13 09:38:43
【问题描述】:

假设您有以下值:

123
1234
4567
12
1

我正在尝试纠正一个 preg_match,它只会为“123”返回 true,因此只匹配 3 位数字。这是我的,但它也匹配 1234 和 4567。我可能也有它之后的东西。

preg_match('/[0-9]{3}/',$number);

【问题讨论】:

    标签: php regex string preg-match


    【解决方案1】:

    你需要的是anchors:

    preg_match('/^[0-9]{3}$/',$number);
    

    它们表示字符串的开始和结束。您需要它们的原因是,通常正则表达式匹配会尝试在主题中找到任何匹配的子字符串。

    正如 rambo 编码器指出的那样,$ 也可以在字符串中的最后一个字符之前匹配,如果最后一个字符是新行的话。要更改此行为(以便 456\n 不会导致匹配),请使用 D 修饰符:

    preg_match('/^[0-9]{3}$/D',$number);
    

    或者,使用\z,它总是匹配字符串的最后,无论修饰符如何(感谢Ωmega):

    preg_match('/^[0-9]{3}\z/',$number);
    

    你说“我也可能有一些事情”。如果这意味着您的字符串应该正好以三位数字开头,但之后可以有任何内容(只要它不是另一个数字),您应该使用负前瞻:

    preg_match('/^[0-9]{3}(?![0-9])/',$number);
    

    现在它也会匹配123abc。使用否定的lookbehind,同样可以应用于正则表达式的开头(如果abc123def 应该给出匹配):

    preg_match('/(?<![0-9])[0-9]{3}(?![0-9])/',$number);
    

    Further reading about lookaround assertions.

    【讨论】:

    • 您应该添加D 标志,以便$ 不能锚定在尾随换行符之前。 preg_match('/^[0-9]{3}$/', "444\n");
    • @rambocoder 谢谢你,很好!
    • /^[0-9]{3}\z/(小写 z)
    • @Ωmega 谢谢,已添加!
    【解决方案2】:

    你需要锚定正则表达式

    /^\d{3}$/
    

    【讨论】:

      【解决方案3】:

      如果您在文本中的任意位置搜索 3 位数字,请使用正则表达式模式

      /(?<!\d)\d{3}(?!\d)/
      

      但是,如果您检查输入只是 3 位数字而不是其他数字,那么请继续

      /\A\d{3}\z/
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-20
        相关资源
        最近更新 更多