手机正则表达式不能完全正常工作
在我国,手机号码的格式如下(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}?[\)]?
是可以应对的。从左到右,您可以输入零或一个(
;您可以输入零或两位数字;您可以输入零或一个)
。
我想这部分应该是这样的:如果你把(
,你将不得不输入两位数和)
,否则你可以输入零或两位数。正则表达式世界中可能有类似的东西或类似的语义吗?
预先感谢
像这样的东西可能:
/^(?:\(\d{2}\)|\d{2}?)\d{4}[. -]?\d{4}$/
我使用非匹配组(?: ...)
和交替提供的电话号码的第一部分两个可能的选项。
要么是\(\d{2}\)
这意味着括号中只有两位数字,或者是\d{2}?
这意味着两位数字或空字符串。
与|
合并这两个选项(这意味着OR),你会得到正则表达式的上述第一部分:(?:\(\d{2}\)|\d{2}?)
这似乎是所有测试用例工作!
尝试这样:^(?:\(\d\d\)|\d\d)?\d{4}[. -]?\d{4}$
如果模式匹配(..)
然后不得不在屋里匹配2个位数。
你能解释一下这个解决方案吗? – 2012-08-03 03:21:21
谢谢你的解决方案! – 2012-08-03 03:28:05
好的,我添加了更多评论。 – godspeedlee 2012-08-03 03:28:10
谢谢你的解决方案! – 2012-08-03 03:28:12