Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用正则表达式格式化电话号码_C#_Regex - Fatal编程技术网

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

C# 使用正则表达式格式化电话号码,c#,regex,C#,Regex,可能重复: 我有一个未格式化的电话号码(保证是10位数字)和一个未格式化的分机号码(可以是空的、空的或任意数量的号码)。我需要把它们组合成一条“友好”的线。我想我应该连接它们,然后使用Regex.Replace格式化连接。下面是在插入一个正则表达式之前,我用来尝试各种正则表达式的单元测试: [Test, Ignore("Sandbox, does not test production code")] public void TestPhoneRegex() {

可能重复:

我有一个未格式化的电话号码(保证是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”,而是“123-456-7890 x”。这是在发布之前需要限制的最后一点开发。帮助?

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

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

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

这可能不是对您问题的直接回答,但可能有帮助。。。我们使用这种模式:

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+))*$";

注意:在我们的案例中,我们已经包含了国家代码,如果他们包含了,您可以很容易地将其删除。我们还没有将扩展包含在其中,因为我们将其移出,如果找到它,则放入另一个字段。

我喜欢正则表达式,请不要误会,但这似乎不是应用它们的有用领域。您所要做的就是将破折号添加到一个由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;
}

是否从组中删除x<代码>(x\d+)?变成了
[\sx]*?(\d+)?
当你写exception时,你是指扩展,对吧?你为什么要在连接后格式化它们?我讨厌这些电话号码格式化的东西,因为它们总是假设每个人的号码在相同的模式下都有相同的位数(不!)@Donal,非常正确,是吗?也许他正在制作一款只在北美使用的应用程序?这里的数字都保证是10位数(不包括国家代码和区号);因为字符串的结尾不匹配,所以在替换过程中保持不变。我用一种稍微不同的方法解决了这个问题,添加了一个uncaptured.*$来表示我想匹配(并替换)整个字符串,不管我是否捕获了可选部分。
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;
}