使用区号+号码或国家/地区+号码捕获手机

时间:2013-02-03 04:36:09

标签: regex

  

可能重复:
  Regular expression to match phone numbers with country codes

目前我有这个正则表达式验证/捕获电话号码:^(\+?(?<country>\d{1,3}?) ?)?(\(?0?(?<area>\d{2})\)? ?)?(?<phone>9?\d{4}[-. ]?\d{4})$

它接受888888888888-88888888.888811 8888-8888(11) 88888888+22 (21) 8888-8888等数字以及此格式的每种组合。< / p>

问题是:当我传递没有contry代码的区号时(例如:(11) 8888-888811 8888-8888或甚至1188888888),它会获得区号代码(11)作为国家/地区代码,区域代码为空。

我怎么能做country + area + phonearea + phone但不是country + phone之类的事情?不做这样的事情:

^(((\(?0?(?<area>\d{2})\)? ?)?|(\+?(?<country>\d{1,3}?) ?)?(\(?0?(?<area>\d{2})\)? ?)?)(?<phone>9?\d{4}[-. ]?\d{4})$

Wich是(区域+电话|国家/地区+电话),但区域和国家/地区正在重复两次。

1 个答案:

答案 0 :(得分:2)

实际上,两位数的国家代码和两位数的区号之间存在歧义。当正则表达式遇到这种情况时,它会将区号视为国家/地区代码,因为国家代码是第一位的,而区号是可选的。

解决方案#1:使用否定前瞻(?!...)

要解决此问题,可以告诉正则表达式忽略两位数国家/地区代码后跟电话号码。为了保持正则表达式足够小(因此不太复杂),可以只给出电话号码的开头。

以下是使用的负面预测:(?!9?\d{4})

如果两位数字后面没有电话号码的开头(9?\d{4}),则该号码仅被视为国家/地区代码。

最终的正则表达式是:

^(\+?(?<country>\d{1,3}?) ?(?!9?\d{4}))?(\(?0?(?<area>\d{2})\)? ?)?(?<phone>9?\d{4}[-. ]?\d{4})$



解决方案#2:模仿正则表达式

IMO,如果一个风味可以允许用模板构建正则表达式,那将是一个强大的功能。好吧,这个功能在我所知道的任何风格中都不存在。

但有一个解决方法。以下代码是用C#

编写的代码段
(...)
string country = "(\\+?(?<country>\\d{1,3}?) ?)";
string area = "(\\(?0?(?<area>\\d{2})\\)? ?)";
string phone = "(?<phone>9?\\d{4}[-. ]?\\d{4})";
string final_regexp = String.Format("^{1}{2}{3}|{2}?{3}$", country, area, phone);
(...)