【问题标题】:regex for exact phone number format准确的电话号码格式的正则表达式
【发布时间】:2012-10-15 11:51:08
【问题描述】:

我目前正在使用这个正则表达式

"/^([0-9\(\)\/\+ \-]*)$/",

这很好,但问题是它也只接受“空白”输入和空格,而且它搞乱了我的验证,什么正则表达式代码可以让我只验证这种类型的输入

(999) 999-9999

并且在输入时也不接受来自用户的“空白”输入字段。任何长度都可以,只要它只接受我上面提到的这个输入。

其他失败的尝试:

^\(\d{3}\)\s{0,1}\d{3}-\d{4}$
/^\(\d{3,4}\) \d{3}-\d{1,10}$/

这是我为这种格式制作正则表达式的其他失败尝试。两者都不接受

(999) 999-9999

【问题讨论】:

  • 在大多数情况下,您实际上只想存储电话号码的数字。如果您的情况属实,我建议您从字段中删除任何不是数字的内容,然后检查您是否拥有正确的数字位数。

标签: regex validation


【解决方案1】:

您还没有说明您正在使用哪种语言进行此操作,因此我们不知道您的正则表达式解析器受到了哪些限制。例如,传统的sed 仅限于 BRE,awk 和 grep 可以处理 ERE,而 linux 系统上的 grep 将处理 PCRE。 Perl 当然也会做 PCRE,Python 和 PHP 也一样。但是 JavaScript 只支持 BRE 的一个子集,并且遗漏了一些 POSIX 类的经典快捷方式。

所以...要在一切支持的 BRE 中执行此操作,您的括号是按字面意思表示的,并且您的范围控制有限:

^([[:digit:]]\{3\})[[:space:]]\{0,1\}[[:digit:]]\{3\}-[[:digit:]]\{4\}$

但这是艰巨而痛苦的。您可能正在使用至少支持 ERE 的东西:

^\([[:digit:]]{3}\)[[:space:]]?[[:digit:]]{3}-[[:digit:]]{4}$

如果你的解析器支持类简写,你可以进一步缩短它:

^\(\d{3}\)\s?\d{3}-\d{4}

最后一个可以与 perl 或 PHP 的 PCRE 支持一起使用,但不能与 sed、awk 或 grep 一起使用。

另外,我要指出,这不是处理输入验证的好方法。你想要更多的灵活性。例如,这是一个更好的主意,

  1. 去除所有非数字字符
  2. 如果结果为 10 位,请检查有效的区号
  3. 如果结果为 11 位且第一位为 1,则检查有效的区号
  4. 否则,将其视为国际号码

您可能还需要提出一些其他条件。

【讨论】:

    【解决方案2】:

    你忘了转义括号。试试这个:^\(\d{3}\)\s{0,1}\d{3}-\d{4}$

    【讨论】:

      【解决方案3】:

      不要将输入验证与数据提取混淆。

      一般来说,强制使用地址或电话号码之类的确切格式是徒劳的。首先,你让一个人(输入数据的人)做计算机的工作(格式化数据),即使这样可行,也可能存在不适合的边缘情况。我相信,无法输入 有效 数据比在您的端出现一些拼写错误要糟糕得多。例如,您拒绝使用国家/地区前缀的任何内容。

      所以为了简单的验证,我只看输入中是否有数字,仅此而已。就像我会寻找 @ 来验证电子邮件地址一样。你花了好几天才得到一个正则表达式,结果却发现它最终并不重要。

      【讨论】:

        【解决方案4】:

        这对我有用。在正则表达式测试器上测试。

        \([1-9][0-9]{2}\)[ ][1-9]{3}[-][0-9]{4}

        这将用于完全匹配 (999) 999-9999 格式。

        在代码中根据需要转义“\”。

        【讨论】:

          【解决方案5】:

          使用+ 而不是* 以避免出现空白。 为了避免“仅限空格”,您可以尝试以下操作:

          "/^([ ]*[0-9\(\)\/\+\-]+[ ]*)*$/"
          

          【讨论】:

            【解决方案6】:

            想出了解决方案,每个人都建议的正则表达式不接受“(”和“)”

            所以我这样做了

            "/^\.{1}\[0-9]{3}\.{2}\[0-9]{3}\-\[0-9]{4}$/",
            

            这样它就可以接受“(”和“)” 对于 (999) 999-9999 输入

            我只需要这个输入的原因是因为我有一个用于自动屏蔽的脚本, 用户的每个输入都将转换为这种格式,这就是为什么我需要那个特定的 来自正则表达式验证的格式。

            【讨论】:

            • 这个正则表达式只有在它在字符串的开头找到一个文字点时才匹配。你确定吗?此外,关于您正在寻找的内容的解释应该出现在您的问题中,而不是您自己制作的答案中。
            • .{1} 表示任意 1 个字符,而不是文字点。我找到了我的问题的答案,这就是答案中的原因。 (-_-)
            • 不,\.{1} 匹配一个且只有一个文字句点。 \. 是原子,{1} 是范围。如果这对您有用,那么还有其他问题。 echo "(999) 999-9999" | egrep '^\.{1}\[0-9]{3}\.{2}\[0-9]{3}\-\[0-9]{4}$' 什么也不返回。除了不正确之外,此答案没有解决问题中所述的要求。对于不太新的 SO 成员的回答,这通常会获得反对票。看看 Graham 或 Ansis 的答案吧。
            • 您的正则表达式将匹配.[0-9]]]..[0-9]]]-[0-9]]]] 之类的字符串,但不匹配电话号码。
            【解决方案7】:

            在 JavaScript 中,在下面使用:

            function validatePhoneNumber(number) { 
                var re = /^\(\d{3}\)\s{0,1}\d{3}-\d{4}$/;
                return re.test(number);
            } 
            

            在 PHP 中:

            <?php
            if (preg_match("/^\(\d{3}\)\s{0,1}\d{3}-\d{4}$/", $number)) {
                //phone number is valid code
            }
            ?>
            

            【讨论】:

              猜你喜欢
              • 2016-01-12
              • 2019-05-23
              • 2017-05-23
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多