需要协助Regex格式化电话号码

时间:2012-02-27 04:46:59

标签: c# regex

我需要一个C#Regex模式来查找字符串中的电话号码并重新格式化。

电话号码可以是任何格式,例如00 0000 0000或(00)0000 0000或+00 0 0000 0000或0000 0000或00-0000-0000或类似格式。所以我基本上寻找至少8个0-9的字符,加号,减号,空格或括号,最多20个字符。这个字符串只包含电话号码和一些文字,所以任何其他号码都没有问题。

我想将带有超链接的号码替换为该电话号码,如下例所示,非A号码从A标签中删除。

<a href="tel:0000000000">00 0000 0000</a>

这是我自己提出的代码,几乎可以运作:

string regex = @"(\b[0-9+\(][\(\)0-9 +-]{6,20}[0-9]\b)";
Regex r = new Regex(regex, RegexOptions.IgnoreCase);
litTelephone.Text = r.Replace(faculty.Telephone, "<a href=\"tel:$1\">$1</a>");

它适用于许多数字,除非它没有拿到这个例子 +00 0 0000 0000 ,如果它在字符串的开头(它从领先加号下降)。它也不会从A标记中删除非数字。

我不知道为什么我对正则表达式这么废话!

2 个答案:

答案 0 :(得分:0)

在你的正则表达式中,如果它跟在“大于”(&gt;)之后,只保留一个匹配将允许你排除你想要改变的数字:

(?<=>)[\+]?(\b[0-9+\(][\(\)0-9 +-]{6,20}[0-9]\b)

类似的东西也会处理扩展:

(?<=>)([\+0-9]{1,3}([ \.\-])?)?([\(]{1}[0-9]{3}[\)])?([0-9A-Z \.\-]{1,32})((x|ext|extension)?[0-9]{1,4}?)

很抱歉过度编辑我的答案。

答案 1 :(得分:-2)

您如何处理人们输入未拨打的额外数字的国家/地区。一个例子是英国,其中+44(0)20 7451 8123被拨打为+442074518123。除非您在英国,否则不会拨打(0),在这种情况下您不拨+4而是拨打02074518123。

同样在俄罗斯和其他前苏联国家,你可能会看到以8开头的数字,除非你们在同一个国家而不是同一个城市,否则你不会拨打8。

最好完全忘记正则表达式。解析数字,应用本地规则去除我提到的数字,然后通过应用格式的国家/地区规则对其进行格式化,以便您正确显示这三个英国数字:

+44 20 8123 7451
+44 1245 261 766
+44 7825 23 45 67

最后一个是手机号码,要求您识别它有一个移动拨号前缀。

当然,如果您在一个国家/地区,请丢弃任何非数字的内容,然后检查国际或长途拨号代码的前几位数字,并将其标准化为+国家/地区代码。 “非数字”的正则表达式为[^0123456789]*