可能重复:
Regular expression to match phone numbers with country codes
目前我有这个正则表达式验证/捕获电话号码:^(\+?(?<country>\d{1,3}?) ?)?(\(?0?(?<area>\d{2})\)? ?)?(?<phone>9?\d{4}[-. ]?\d{4})$
它接受88888888
,8888-8888
,8888.8888
,11 8888-8888
,(11) 88888888
,+22 (21) 8888-8888
等数字以及此格式的每种组合。< / p>
问题是:当我传递没有contry代码的区号时(例如:(11) 8888-8888
或11 8888-8888
或甚至1188888888
),它会获得区号代码(11)作为国家/地区代码,区域代码为空。
我怎么能做country + area + phone
或area + phone
但不是country + phone
之类的事情?不做这样的事情:
^(((\(?0?(?<area>\d{2})\)? ?)?|(\+?(?<country>\d{1,3}?) ?)?(\(?0?(?<area>\d{2})\)? ?)?)(?<phone>9?\d{4}[-. ]?\d{4})$
Wich是(区域+电话|国家/地区+电话),但区域和国家/地区正在重复两次。
答案 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);
(...)