1

可能重复:
正则表达式将电话号码与国家代码匹配

目前我有这个正则表达式来验证/捕获电话号码:^(\+?(?<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以及这种格式的每个组合。

问题是:当我通过没有国家代码的区号(像这样:(11) 8888-888811 8888-8888什至1188888888)时,它会将区号部分(11)作为国家代码,并将区号留空。

我怎么能做类似country + area + phoneORarea + phone但 NOT的事情country + phone?不做这样的事情:

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

Wich 是 (area+phone|country+area+phone) 但 area 和 country 正则表达式重复两次。

4

1 回答 1

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);
(...)
于 2013-02-04T10:37:43.640 回答