Frage

Ich versuche, eine Zeichenfolge wie die folgenden mit einem .NET regulären Ausdruck zu analysieren:

H3Y5NC8E-TGA5B6SB-2NVAQ4E0

und gibt das folgende Verwendung von Split:     H3Y5NC8E     TGA5B6SB     2NVAQ4E0

ich jedes Zeichen gegen einen bestimmten Zeichensatz validieren (beachten Sie, dass die Buchstaben ‚I‘, ‚O‘, ‚U‘ & ‚W‘ abwesend sind), so mit String.split keine Option ist. Die Anzahl der Zeichen in jeder Gruppe können unterschiedlich sein und die Zahl der Gruppen können ebenfalls variieren. Ich verwende den folgenden Ausdruck:

([ABCDEFGHJKLMNPQRSTVXYZ0123456789]{8}-?){3}

Dies wird genau 3 Gruppen von 8 Zeichen übereinstimmen je. Alle mehr oder weniger wird das Spiel nicht. Das funktioniert soweit sie korrekt die Eingabe übereinstimmt. Allerdings, wenn ich die Split-Methode verwenden, um jede Zeichengruppe zu extrahieren, bekomme ich nur die letzte Gruppe. RegexBuddy beschwert sich, dass ich die Erfassungsgruppe wiederholt, selbst und dass ich eine Capture-Gruppe um die wiederholte Gruppe setzen sollte. Aber keiner meiner Versuche, dies zu tun, um das gewünschte Ergebnis zu erzielen. Ich habe Ausdrücke wie diese versuchen:

(([ABCDEFGHJKLMNPQRSTVXYZ0123456789]{8})-?){4}

Aber das funktioniert nicht.

Da ich die Regex in Code zu generieren, konnte ich es nur durch die Anzahl der Gruppen erweitern, aber ich war für eine elegantere Lösung hoffen.


Bitte beachten Sie, dass der Zeichensatz nicht das gesamte Alphabet enthält. Es ist Teil einer Produktaktivierungssystem. Als solche werden alle Zeichen, die versehentlich als Zahlen oder andere Zeichen interpretiert werden können, werden entfernt. z.B. Die Buchstaben 'I', 'O', 'U' & 'W' ist nicht im Zeichensatz.

Die Bindestriche sind optional, da ein Benutzer nicht oben benötigt geben Sie sie in, aber sie können es sein, wenn der Benutzer als eine Copy & Paste durchgeführt.

War es hilfreich?

Lösung 2

Ich habe die Antwort entdeckte ich nach war. Hier ist mein Arbeits Code:

    static void Main(string[] args)
    {
        string pattern = @"^\s*((?<group>[ABCDEFGHJKLMNPQRSTVXYZ0123456789]{8})-?){3}\s*$";
        string input = "H3Y5NC8E-TGA5B6SB-2NVAQ4E0";
        Regex re = new Regex(pattern);
        Match m = re.Match(input);

        if (m.Success)
            foreach (Capture c in m.Groups["group"].Captures)
                Console.WriteLine(c.Value);
    }

Andere Tipps

BTW, können Sie ersetzen [ABCDEFGHJKLMNPQRSTVXYZ0123456789] Zeichenklasse mit einer besser lesbaren subtrahierten Zeichenklasse.

[[A-Z\d]-[IOUW]]

Wenn Sie nur wollen, wie die drei Gruppen übereinstimmen, warum Sie diese Muster nicht verwenden 3-mal in Ihrem regex und nur gefangen verwenden 1, 2, 3 Untergruppen die neue Zeichenfolge zu bilden?

([[A-Z\d]-[IOUW]]){8}-([[A-Z\d]-[IOUW]]){8}-([[A-Z\d]-[IOUW]]){8}

In PHP ich zurückkehren würde (ich weiß nicht, .NET)

return "$1 $2 $3";

Ihre Frage und die Antworten Nach der Überprüfung gegeben, ich kam mit dieser:

RegexOptions options = RegexOptions.None;
Regex regex = new Regex(@"([ABCDEFGHJKLMNPQRSTVXYZ0123456789]{8})", options);
string input = @"H3Y5NC8E-TGA5B6SB-2NVAQ4E0";

MatchCollection matches = regex.Matches(input);
for (int i = 0; i != matches.Count; ++i)
{
    string match = matches[i].Value;
}

Da die „-“ ist optional, Sie brauchen es nicht zu schließen. Ich bin nicht sicher, was Sie wurde mit dem {4} am Ende für? Dies wird die Spiele finden auf das, was Sie wollen, dann den Match verwenden Sie jedes Spiel zugreifen können die Zeichenfolge neu zu erstellen.

Warum Regex verwenden? Wenn die Gruppen, die durch eine immer gespalten sind -, können Sie nicht verwenden, Split ()

?

Sorry, wenn dies nicht das, was Sie gedacht, aber die Zeichenfolge hat immer den Bindestrich die Gruppen trennt dann statt regex verwenden könnten Sie nicht die String.Split () -Methode verwenden?

Dim stringArray As Array = someString.Split("-")

Was sind die bestimmenden Merkmale eines gültigen Block? Wir würden müssen wissen, dass wirklich um hilfreich zu sein.

Mein allgemeiner Vorschlag, bestätigt die charset in einem ersten Schritt, dann aufgeteilt und in einem separaten Verfahren analysieren, basierend auf, was Sie erwarten. Wenn diese in einer Website / app ist, dann können Sie die ASP-Regex Validierung auf dem Front-End verwenden dann brechen sie auf dem hinteren Ende nach oben.

Wenn Sie nur den Wert der Gruppe überprüft, mit der Gruppe (i) .value, dann werden Sie nur die letzten bekommen. Wenn Sie jedoch wollen über alle Zeiten aufzuzählen, die Gruppe gefangen genommen wurde, die Verwendung Gruppe (2) .captures (i) .value, wie unten gezeigt.

system.text.RegularExpressions.Regex.Match("H3Y5NC8E-TGA5B6SB-2NVAQ4E0","(([ABCDEFGHJKLMNPQRSTVXYZ0123456789]+)-?)*").Groups(2).Captures(i).Value

Mike,

Sie können Zeichensatz Ihrer Wahl innerhalb von Zeichengruppe verwenden. Alles, was Sie brauchen, ist „+“ Modifikator zu erfassen alle Gruppen hinzuzufügen. Siehe meine vorherige Antwort, nur ändern [A-Z0-9], um alles, was Sie benötigen (d [ABCDEFGHJKLMNPQRSTVXYZ0123456789])

Sie können dieses Muster verwenden:

Regex.Split("H3Y5NC8E-TGA5B6SB-2NVAQ4E0", "([ABCDEFGHJKLMNPQRSTVXYZ0123456789]{8}+)-?")

Aber Sie müssen leere Strings herauszufiltern aus resultierender Array. Zitat aus MSDN :

  

Falls mehrere Übereinstimmungen benachbart zueinander sind, eine leere Zeichenfolge in das Array eingefügt wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top