正则表达式匹配电话号码

3

我的话(电话号码)可能以“00”或“+”开头。

电话号码示例:

00xxx xx xxxxxxx
+xxx xx xxxxxxx
(+xxx) xx xxxxxxx
(00xxx) xx xxxxxxx

我有:

Regex regexObj = new Regex(@"^\(?[+( ]?([0-9]{3})\)?[) ]?([0-9]{2})[- ]?([0-9]{7})$");

if (regexObj.IsMatch(TextBox1.Text))
{
    // IF OK
    string formattedPhoneNumber = regexObj.Replace(TextBox1.Text, "(+$1) $2 $3");
}

如何将其放入正则表达式中?目前我只能放置“+”,以及“(”和“)”。
谢谢。
5个回答

2

1
这样怎么样:
Regex regexObj = new Regex(@"^(?:\(?)(?:\+|0{2})([0-9]{3})\)? ([0-9]{2}) ([0-9]{7})$");

编辑:

^(?:\((?:\+|00)([0-9]{3})\)|(?:\+|00)([0-9]{3}))? ([0-9]{2})[- ]?([0-9]{7})$

这个答案错误地匹配了:"00353) 86 5551212","(00353 86 5551212","+00353 86 5551212"。 - Blazes
我发现它很好地匹配了“00353)86 5551212”,“(00353 86 5551212”。我承认“+00xxx xx xxxxxxx”是一个问题,并已相应地进行了更新。 - Beno
但是,@Beno - 那不是一个有效的电话号码... - Blazes
终于明白你的意思了 - 你的第一条评论让我困惑了,因为“+00353 86 5551212”与第一个正则表达式不匹配。我已经更新了答案。 - Beno

1

使用你的示例进行测试:

Regex regexObj = new Regex(@"^(?:(?:\+|00)([0-9]{3})|\((?:\+|00)([0-9]{3})\))[- ]?([0-9]{2})[- ]?([0-9]{7})$");

if (regexObj.IsMatch(TextBox1.Text))
{
    //IF OK
    string formattedPhoneNumber = regexObj.Replace(TextBox1.Text, "(+$1$2) $3 $4");
}

说明:

(?:\+|00):匹配+00 - 不捕获

(?:(?:\+|00)([0-9]{3})|\((?:\+|00)([0-9]{3})\)):匹配+xxx或00xxx或(+xxx)或(00xxx),仅捕获数字。将( )匹配分开很重要,因此如果包括括号,则必须同时出现才能匹配(例如(+999 99 9999999是无效的)。

"(+$1$2) $3 $4":匹配将捕获第一个或第二个([0-9]{3})组,但不会同时捕获两个组 - 必须在此处将它们合并。


1

这个正则表达式可以匹配你的四种不同的电话号码前缀,后面跟着两位数字,再后面是七位数字。

(?:(00\d{3})|(\+\d{3})|(\(\+\d{3}\))|(\(00\d{3}\)))\s(\d{2})\s(\d{7})


1

将工作分成几个步骤。

第一步必须是在调查号码的其余部分之前剥离+353、00 353、011 353、+353 (0)、00 353 (0)、011 353 (0)或0前缀。

  Pattern: ^(\(?(?:0(?:0|11)\)?[\s-]?\(?|\+)(353)\)?[\s-]?)?\(?0?(?:\)[\s-]?)?([1-9]\d{1,4}\)?[\d\s-]+)((?:x|ext\.?|\#)\d{3,4})?$

使用上述模式从$2中提取“353”,以了解是否使用国际格式,否则如果$2为空,则假定为国内格式。
从$4中提取可选的分机号码详细信息,并将其存储以备后用。
从$3中提取NSN(包括空格、连字符和括号)。
删除这些空格、连字符和括号,并使用另一个更详细的正则表达式模式通过长度和初始数字验证号码的NSN部分。
不必担心用户输入不匹配的括号或随机标点符号。目标是确保用户输入了足够数量的数字以生成有效的电话号码。提取并验证该号码,然后根据每个号码范围的正确格式规则进行清理以供显示。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接