如何使用正则表达式格式化电话号码

时间:2015-07-09 17:19:28

标签: c# regex

我需要以特定方式格式化我的电话号码。不幸的是,业务规则禁止我预先这样做。 (单独的输入框等。)

格式必须为+1-xxx-xxx-xxxx,其中“+1”是常量。 (我们不做国际业务)

这是我的正则表达式模式来测试输入:

"\\D*([2-9]\\d{2})(\\D*)([2-9]\\d{2})(\\D*)(\\d{4})\\D*"

(我从其他地方偷走了)

然后我像这样执行regex.Replace():

regex.Replace(telephoneNumber, "+1-$1-$3-$5"); **THIS IS WHERE IT BLOWS UP**

如果我的电话号码在字符串中已经有“+1”,那么它会预先设置另一个,这样我就得+ 1- + 1-xxx-xxx-xxxx

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:2)

您可以添加(?:\+1\D*)?以捕获号码前的可选前缀。它已被捕获,如果它被取代,它将被替换。

您不需要在号码前后使用\D*。因为它们是可选的,所以它们不会改变任何东西。

您不需要捕获您不会使用的部分,这样可以更轻松地查看更换中的内容。

str = Regex.Replace(str, @"(?:\+1\D*)?([2-9]\d{2})\D*([2-9]\d{2})\D*(\d{4})", "+1-$1-$2-$3");

您可以考虑为分隔符使用比\D*更具体的内容,例如[\- /]?。使用非特定模式,您可能会发现某些不是电话号码的内容,例如将"I have 234 cats, 528 dogs and 4509 horses."更改为"I have +1-234-528-4509 horses."

str = Regex.Replace(str, @"(?:\+1[\- /]?)?([2-9]\d{2})[\- /]?([2-9]\d{2})[\- /]?(\d{4})", "+1-$1-$2-$3");

答案 1 :(得分:1)

尝试这样的事情以使事情更具可读性:

"sDom": 'T<"clear">lfrtip',
"oTableTools": {***tableTools options**},
"sPaginationType": "full_numbers",
"bPaginate": true,
"iDisplayLength": 30,
"bLengthChange": false,
"bInfo": true,
"oLanguage": { *** some translations *** }

将为Regex rxPhoneNumber = new Regex( @" ^ # anchor the start-of-match to start-of-text \D* # - allow and ignore any leading non-digits 1? # - we'll allow (and ignore) a leading 1 (as in 1-800-123-4567 \D* # - allow and ignore any non-digits following that (?<areaCode>[2-9]\d\d) # - required 3-digit area code \D* # - allow and ignore any non-digits following the area code (?<exchangeCode>[2-9]\d\d) # - required 3-digit exchange code (central office) \D* # - allow and ignore any non-digits following the C.O. (?<subscriberNumber>\d\d\d\d) # - required 4-digit subscriber number \D* # - allow and ignore any non-digits following the subscriber number $ # - followed the end-of-text. " , RegexOptions.IgnorePatternWhitespace|RegexOptions.ExplicitCapture ); string input = "voice: 1 (234) 567/1234 (leave a message)" ; bool isValid = rxPhoneNumber.IsMatch(input) ; string tidied = rxPhoneNumber.Replace( input , "+1-${areaCode}-${exchangeCode}-${subscriberNumber}" ) ; 提供所需的值

tidied

答案 2 :(得分:0)

您可以使用以下正则表达式

\D*(\+1-)?([2-9]\d{2})\D*([2-9]\d{2})\D*(\d{4})\D*

替换字符串:

$1$2-$3-$4

这是demo

这是对你所拥有的正则表达式的一种调整。如果你需要匹配整个数字,我会使用

(\+1-)?\b([2-9]\d{2})\D*([2-9]\d{2})\D*(\d{4})\b

请参阅demo 2

enter image description here

此外,如果\+1-中的连字符是可选的,请添加?\+1-?

为了使正则表达式更安全,我用一些包含已知分隔符的字符类替换\D* 0或更多非数字符号),例如[ /-]*(匹配/,空格和- s)。