2012-08-03 61 views
0

在我国,手机号码的格式如下(XX)XXXX-XXXX。但是根据输入文本中的模式输入电话号码太主流了。有些人追随,但有些人却没有。我想制作一个正则表达式来捕捉所有可能的情况。现在它看起来像这样:手机正则表达式不能完全正常工作

/^[\(]?\d{2}?[\)]?\d{4}[. -]?\d{4}$/ 

我准备了一些测试案例来证明正则表达式的功能

# GOOD PHONES # 
8432115262 
843211 5262 
843211.5262 
843211-5262 
32115262 
3211.5262 
3211 5262 
3211-5262 
(84)32115262 
(84)3211.5262 
(84)3211 5262 
(84)3211-5262 

# BAD PHONES # 
[email protected]#$%*() 
()32115262 
()1231 3213 
()1231.3213 
()1231-3213 
().3213 
()-3213 
()3213. 
()3213- 
3211-5a62 
sakdiihbnmwlzi 

不幸的是,错误的情况下()32115262被绕过的正则表达式。 Altought很清楚为什么。这部分[\(]?\d{2}?[\)]?是可以应对的。从左到右,您可以输入零或一个(;您可以输入零或两位数字;您可以输入零或一个)

我想这部分应该是这样的:如果你把(,你将不得不输入两位数和),否则你可以输入零或两位数。正则表达式世界中可能有类似的东西或类似的语义吗?

预先感谢

回答

1

像这样的东西可能:

/^(?:\(\d{2}\)|\d{2}?)\d{4}[. -]?\d{4}$/ 

我使用非匹配组(?: ...)和交替提供的电话号码的第一部分两个可能的选项。

要么是\(\d{2}\)这意味着括号中只有两位数字,或者是\d{2}?这意味着两位数字或空字符串。

|合并这两个选项(这意味着OR),你会得到正则表达式的上述第一部分:(?:\(\d{2}\)|\d{2}?)

这似乎是所有测试用例工作!

+0

谢谢你的解决方案! – 2012-08-03 03:28:12

1

尝试这样:^(?:\(\d\d\)|\d\d)?\d{4}[. -]?\d{4}$

如果模式匹配(..)然后不得不在屋里匹配2个位数。

+0

你能解释一下这个解决方案吗? – 2012-08-03 03:21:21

+0

谢谢你的解决方案! – 2012-08-03 03:28:05

+0

好的,我添加了更多评论。 – godspeedlee 2012-08-03 03:28:10