使用Regex格式化电话号码

Kei*_*thS 10 c# regex

可能重复:
用于电话号码验证的全面正则表达式

我有一个未格式化的电话号码(保证是10位数)和未格式化的扩展名(可以是空,空白或任意数量的数字).我需要将它们组合成一个"友好"的字符串.我以为我会连接它们,然后使用Regex.Replace格式化连接.这是我插入之前用来尝试各种正则表达式的单元测试:

    [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);
    }
Run Code Online (Sandbox Code Playgroud)

预期的格式化字符串是格式化的电话号码,没有"x"和扩展名.但是,最后一个捕获组匹配"x"后面有或没有数字,所以代替"123-456-7890"我得到"123-456-7890 x".这是在发布之前需要关联的最后一点开发.救命?

Joh*_*ald 10

我喜欢正则表达式,不要误会我的意思,但这似乎不适合应用它们.您所做的就是将破折号添加到10个数字的字符串中,然后添加一个可选的"x"后跟一个扩展名.越简单越好.

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;
}
Run Code Online (Sandbox Code Playgroud)


Kob*_*obi 4

x 与您的正则表达式不匹配,因此它不会替换字符串的放置。试试这个正则表达式:

@"^(\d{3})[ -]?(\d{3})[ -]?(\d{4}) x(\d*)
Run Code Online (Sandbox Code Playgroud)

在新的正则表达式中x 不是可选的- 根据您的代码它将始终存在(如果您确实希望它是可选的,您可以使用?x?(\d*))。另外,我们正在使用\d*,因此请确保最后一组始终匹配,即使它为空。