首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >北美电话号码的正则表达式验证

北美电话号码的正则表达式验证
EN

Stack Overflow用户
提问于 2015-10-16 05:23:26
回答 2查看 1.4K关注 0票数 0

我很难找到一个可以检测到以下内容的模式

909-999-9999

909 999 9999

(909) 999-9999

(909) 9999999

999 999 9999

9999999999

代码语言:javascript
复制
\A[(]?[0-9]{3}[)]?[ ,-][0-9]{3}[ ,-][0-9]{3}\z

我试过了,但它并不适用于所有的实例。我在想,我可以通过将每个字符放入一个数组中,然后检查它来划分问题。但是这样代码就太长了。

EN

回答 2

Stack Overflow用户

发布于 2015-10-16 05:28:58

最后一组中有4个数字,在正则表达式中指定为3。

您还需要对分隔符应用?量词(1次或0次),因为它们是可选的。

使用

代码语言:javascript
复制
^[(]?[0-9]{3}[)]?[ ,-]?[0-9]{3}[ ,-]?[0-9]{4}$

请参阅the demo here

PHP demo

代码语言:javascript
复制
$re = "/\A[(]?[0-9]{3}[)]?[ ,-]?[0-9]{3}[ ,-]?[0-9]{4}\z/"; 
$strs = array("909-999-9999", "909 999 9999", "(909) 999-9999", "(909) 999 9999", "999 999 9999","9999999999"); 
$vals = preg_grep($re, $strs);
print_r($vals);

another one

代码语言:javascript
复制
$re = "/\A[(]?[0-9]{3}[)]?[ ,-]?[0-9]{3}[ ,-]?[0-9]{4}\z/"; 
$str = "909-999-9999";
if (preg_match($re, $str, $m)) {
    echo "MATCHED!";
}

顺便说一句,可选的?子模式比交替执行得更好。

票数 1
EN

Stack Overflow用户

发布于 2015-10-16 05:25:15

试试这个正则表达式:

代码语言:javascript
复制
^(?:\(\d{3}\)|\d{3})[- ]?\d{3}[- ]?\d{4}$

解释:

代码语言:javascript
复制
^                 # from start
(?:               # one of
    \(\d{3}\)     # '(999)' sequence
        |         # OR
    \d{3}         # '999' sequence
)                 #
[- ]?             # may exist space or hyphen
\d{3}             # three digits
[- ]?             # may exist space or hyphen
\d{4}             # four digits
$                 # end of string

希望能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33158774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档