11 Stimmen

Telefonnummerformatierung mit Regex

Möglicher Duplikat:
Ein umfassender Regex für die Validierung von Telefonnummern

Ich habe eine unformatierte Telefonnummer (garantiert 10 Ziffern) und eine unformatierte Erweiterung (könnte null, leer oder eine beliebige Anzahl von Zahlen sein). Ich muss sie zu einem "freundlichen" String zusammenfügen. Ich dachte, ich würde sie konkatenieren und dann die Konkatenation mit einem Regex.Replace formatieren. Hier ist der Unittest, den ich verwende, um verschiedene Regexes auszuprobieren, bevor ich einen einfüge:

    [Test, Ignorieren("Sandbox, testet keinen Produktionscode")]
    public void TestPhoneRegex()
    {
        string nummer = "1234567890";
        string erweiterung = "";

        var formatierteKontaktnummer =
            Regex.Replace("{0} x{1}".FormatWith(nummer, erweiterung),
                          @"^(\d{3})[ -]?(\d{3})[ -]?(\d{4})( x\d+)?",
                          @"$1-$2-$3$4");

        Debug.WriteLine("{0} x{1}".FormatWith(nummer, erweiterung));
        Debug.WriteLine(formatierteKontaktnummer);

        Assert.AreEqual("123-456-7890", formatierteKontaktnummer);
    }

Der erwartete formatierte String ist die formatierte Telefonnummer ohne das "x" und die Erweiterung. Allerdings passt die letzte Erfassungsgruppe das "x" mit oder ohne einer Zahl dahinter an, also statt "123-456-7890" erhalte ich "123-456-7890 x". Dies ist der letzte Entwicklungsschritt, der vor einer Veröffentlichung abgeschlossen sein muss. Hilfe?

12voto

John McDonald Punkte 1770

Ich liebe reguläre Ausdrücke, versteh mich nicht falsch, aber dies scheint nicht wie ein nützlicher Bereich zu sein, um sie anzuwenden. Alles, was du tust, ist Bindestriche zu einer Zeichenfolge von 10 Zahlen hinzuzufügen und dann optional ein "x" gefolgt von einer Erweiterung. Einfacher ist besser.

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;
}

3voto

Kobi Punkte 129985

X wird nicht durch Ihren Regex abgeglichen, daher wird es nicht aus dem String entfernt. Versuchen Sie stattdessen diesen Regex:

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

Im neuen Regex x ist nicht optional - es wird immer gemäß Ihrem Code vorhanden sein (Wenn Sie möchten, dass es optional ist, können Sie ?x?(\d*) verwenden). Außerdem verwenden wir \d*, stellen Sie also sicher, dass die letzte Gruppe immer übereinstimmt, auch wenn sie leer ist.

2voto

Reddog Punkte 14469

Dies ist möglicherweise keine direkte Antwort auf Ihre Frage, aber möglicherweise hilfreich... Wir verwenden dieses Muster:

public const string NorthAmericanPhonePattern = @"^(\+?(?1)\s*[-\/\.]?)?(\((?\d{3})\)|(?\d{3}))\s*[-\/\.]?\s*(?\d{3})\s*[-\/\.]?\s*(?\d{4})\s*(([xX]|[eE][xX][tT])\.?\s*(?\d+))*$";

Und dann neu formatieren mit:

private static string PhoneNumberMatchEvaluator(Match match)
{
    // Formatieren zu nordamerikanischen Telefonnummern im Stil "0 (000) 000-0000"
    //                                    ODER  "(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));
}

Hinweis: In unserem Fall haben wir den Ländercode eingefügt, wenn er vorhanden war, das könnten Sie leicht entfernen. Wir haben auch die Erweiterung nicht eingeschlossen - da wir sie herausnehmen und in ein anderes Feld setzen, wenn wir sie finden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X