Phone Number formatting using Regex
本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
A comprehensive regex for phone number validation
我有一个未格式化的电话号码(保证是10位数)和未格式化的扩展名(可以是空,空白或任意数量的数字)。 我需要将它们组合成一个"友好"的字符串。 我以为我会连接它们,然后使用Regex.Replace格式化连接。 这是我插入之前用来尝试各种正则表达式的单元测试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | [Test, Ignore("Sandbox, does not test production code")] public void TestPhoneRegex() { string number ="1234567890"; string extension =""; var formattedContactNumber = Regex.Replace("{0} x{1}".FormatWith(number, extension), @"^(\d{3})[ -]?(\d{3})[ -]?(\d{4})( x\d+)?", @"$1-$2-$3$4"); Debug.WriteLine("{0} x{1}".FormatWith(number, extension)); Debug.WriteLine(formattedContactNumber); Assert.AreEqual("123-456-7890", formattedContactNumber); } |
预期的格式化字符串是格式化的电话号码,没有"x"和扩展名。 但是,最后一个捕获组匹配"x"后面有或没有数字,所以代替"123-456-7890"我得到"123-456-7890 x"。 这是在发布之前需要关联的最后一点开发。 救命?
我喜欢正则表达式,不要误会我的意思,但这似乎不适合应用它们。您所做的就是将破折号添加到10个数字的字符串中,然后添加一个可选的"x"后跟一个扩展名。越简单越好。
1 2 3 4 5 6 7 8 9 10 11 | public static String beautifyPhoneNumber(String number, String extension) { String beautifulNumber = number.Substring(0, 3) +"-" + number.Substring(3, 3) +"-" + number.Substring(6, 4); if (!String.IsNullOrEmpty(extension)) { beautifulNumber +=" x" + extension; } return beautifulNumber; } |
这可能不是你问题的直接答案,但可能有用......我们使用这种模式:
1 | public const string NorthAmericanPhonePattern = @"^(\+?(?<NatCode>1)\s*[-\/\.]?)?(\((?<AreaCode>\d{3})\)|(?<AreaCode>\d{3}))\s*[-\/\.]?\s*(?<Number1>\d{3})\s*[-\/\.]?\s*(?<Number2>\d{4})\s*(([xX]|[eE][xX][tT])\.?\s*(?<Ext>\d+))*$"; |
然后重新格式化:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | private static string PhoneNumberMatchEvaluator(Match match) { // Format to north american style phone numbers"0 (000) 000-0000" // OR "(000) 000-0000" Debug.Assert(match.Success); if (match.Groups["NatCode"].Success) { return match.Result("${NatCode} (${AreaCode}) ${Number1}-${Number2}"); } else { return match.Result("(${AreaCode}) ${Number1}-${Number2}"); } } private static string FormatPhoneNumber(string phoneNumber) { var regex = new Regex(NorthAmericanPhonePattern, RegexOptions.IgnoreCase); return regex.Replace(phoneNumber, new MatchEvaluator(PhoneNumberMatchEvaluator)); } |
注意:在我们的案例中,我们已经包含了国家代码,如果他们这样做了,您可以轻松地将其删除。我们还没有将扩展包括在那里 - 因为我们将它移出并在我们找到它时进入不同的领域。
x与正则表达式不匹配,因此不会替换字符串的put。试试这个正则表达式:
1 | @"^(\d{3})[ -]?(\d{3})[ -]?(\d{4}) x(\d*) |
在新的正则表达式