我试图写一个正则表达式来检查电话号码输入的有效性。有几条规则:
我想出了这个:
^(\+|\()?(\)?|\ *|\d{8,11})$
问题是,这只匹配一行中的8-11位数字,但是数字可以在任何地方,只有它们的总数应该是8-11。
发布于 2015-02-18 16:56:31
我想您想要实现这种格式,但不需要破折号?此外,如果要解析http://en.wikipedia.org/wiki/North_American_Numbering_Plan,还有更严格的规则。请更新您的问题,并更具体。
此正则表达式可用于将所有8-11
数字与前面的加号相匹配。
^\+?( *\d){8,11} *$
有趣的部分是( *\d){8,11} *
。括号之间的每个组匹配无限数量的空格(可以是零,后面是一个数字)。因此,总的来说,您有8
到11
数字,中间的空格是无限制的。您还需要将*
放在末尾,以处理跟踪空间。
如果您想要允许括号,那么这个问题就更复杂了,因为括号也使用了一些数字。如果数字的总数固定为3),您可以将其写成
^\(( *\d){3} *\)( *\d){5,8} *$
现在您可以泛化此方法并生成:
^\(( *\d){1} *\)( *\d){7,10} *$
^\(( *\d){2} *\)( *\d){6,9} *$
^\(( *\d){3} *\)( *\d){5,8} *$
^\(( *\d){4} *\)( *\d){4,7} *$
^\(( *\d){5} *\)( *\d){3,6} *$
^\(( *\d){6} *\)( *\d){2,5} *$
^\(( *\d){7} *\)( *\d){1,4} *$
^\(( *\d){8} *\)( *\d){0,3} *$
^\(( *\d){9} *\)( *\d){0,2} *$
^\(( *\d){10} *\)( *\d){0,1} *$
^\(( *\d){11} *\) *$
现在只是把它们结合起来的问题:
^(\+?( *\d){8,11} *)|
\(( *\d){1} *\)( *\d){7,10} *|
\(( *\d){2} *\)( *\d){6,9} *|
\(( *\d){3} *\)( *\d){5,8} *|
\(( *\d){4} *\)( *\d){4,7} *|
\(( *\d){5} *\)( *\d){3,6} *|
\(( *\d){6} *\)( *\d){2,5} *|
\(( *\d){7} *\)( *\d){1,4} *|
\(( *\d){8} *\)( *\d){0,3} *|
\(( *\d){9} *\)( *\d){0,2} *|
\(( *\d){10} *\)( *\d){0,1} *|
\(( *\d){11} *\) *$
但我认为@DaveKirby制作了一个有效点。这些规定在不同的地区和时间上有很大的不同(谁说我们会在20年内以同样的方式写电话号码?)你最好别想抓住他们。
发布于 2015-02-18 16:53:14
当涉及到支持国际电话号码时,这个问题相当复杂,因为规则可能因国而异,或者在巴西这样的一些(大国)国家,规则可能因移动电话而异。
https://stackoverflow.com/questions/28589060
复制相似问题