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

21 浏览
0 Comments

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

这个问题在这里已经有了答案

可能的重复:

一个电话号码验证的综合正则表达式

我有一个未格式化的电话号码(保证为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);
    }

期望的格式化字符串是去除“x”和分机的格式化电话号码。然而,最后的捕获组匹配了有或者没有数字的“x”,所以我得到了“123-456-7890 x”而不是“123-456-7890”。这是发布之前需要解决的最后一个开发问题。请帮忙?

admin 更改状态以发布 2023年5月23日
0
0 Comments

x没有被你的正则表达式匹配,因此它不会替换出字符串。请尝试使用以下正则表达式:

@"^(\d{3})[ -]?(\d{3})[ -]?(\d{4}) x(\d*)

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

0
0 Comments

我喜欢正则表达式,但是在这种情况下似乎并没有什么用处。你所做的只是将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;
}

0