Match und split-string mit regex
Möchte ich die Validierung einer Eingabe-Zeichenkette anhand eines regulären Ausdrucks und dann gespalten.
Den input-string kann eine beliebige Kombination der Buchstaben A und dem Buchstaben A, gefolgt von einem Ausrufezeichen. Zum Beispiel diese gültig sind Eingabe-strings: A, A!, AA, AA!, Ein!A, A!Ein!, AAA, AAA!, AA!A, A!AA, ... Alle anderen Zeichen sollen bedeuten eine ungültige match.
Mein code würde wahrscheinlich so Aussehen:
public string[] SplitString(string s)
{
Regex regex = new Regex(@"...");
if (!regex.IsMatch(s))
{
throw new ArgumentException("Wrong input string!");
}
return regex.Split(s);
}
Wie sollte mein regex Aussehen?
Bearbeiten, - einige Beispiele:
- input-string "AAA", sollte die Funktion liefert ein array von 3 strings ("A", "A", "A")
- input-string "Ein!AAA!", sollte die Funktion liefert ein array aus 4 strings ("A!", "A", "A", "A!")
- input-string "AA!b", sollte die Funktion löst eine ArgumentException
- Sind Sie sicher, dass dies kein Hausaufgaben?
- und angenommen, es ist immer noch eine berechtigte Frage. Trotzdem, solche "meta" - tags sind entmutigt.
- Warum würden Sie verwenden, regex für das, klingt wie overkill
- ja, ich bin sicher. @H. B. - dies ist ein Vereinfachtes Beispiel, es könnte mehr verschiedene Buchstaben, aber jeder von Ihnen sein sollte, entweder allein oder mit Ausrufezeichen am Ende.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Scheint nicht, wie ein Regex ist ein guter plan hier. Haben Sie einen Blick auf diese:
Den Grund für die Regex nicht ein guter plan ist, dass Sie schreiben können, die Logik in ein paar einfachen if-Anweisungen, die kompiliert und Funktion viel schneller und billiger. Auch Regex nicht so gut, bei sich wiederholenden mustern für eine unbegrenzte Zeichenfolge der Länge. Sie werden entweder Ende zu schreiben, eine lange Regex oder etwas unleserlich.
BEARBEITEN
Am Ende von meinem code, den Sie entweder
List<string>
mit der split-input-string wie in deiner Frage. Oder eine leereList<string>
. Sie können es anpassen, ein wenig zu lösen eine ArgumentException aus, wenn diese Anforderung ist sehr wichtig für Sie. Alternativ können Sie eineCount
auf die Liste, um zu sehen, ob es erfolgreich war.Edit:
Etwas wie http://gskinner.com/RegExr/ zu spielen, die mit Regulären Ausdrücken
Edit nach Kommentar:
Ok, Sie haben es ein wenig klarer, was Sie wollen. Nähern Sie sich nicht Sie es wie dass. Denn in dem, was Sie tun, Sie können nicht erwarten, dass eine übereinstimmung mit dem gesamten input und dann aufteilen, wie es sein würde, die gesamte Eingabe. Entweder verwenden Sie separate regulären Ausdruck für die split-Teil, oder verwenden Sie Gruppen, um die angepassten Werte.
Beispiel:
Wieder, reguläre Ausdrücke sind nicht immer die Antwort. Sehen, wie könnte dies Auswirkungen auf Ihre Anwendung.
Könnten Sie versuchen, so etwas wie:
((A+!?)+)
Versuchen Sie bei Espresso http://www.ultrapico.com/Expresso.htm oder Rad Software Regular Expression Designer http://www.radsoftware.com.au/regexdesigner/ für die Gestaltung und Erprobung von RE.
Ich denke ich habe eine Lösung, erfüllt alle Beispiele. Ich musste es brechen in zwei reguläre Ausdrücke (die ich nicht mag)...
Hinweis: die Verwendung von linq - erforderlich, um die leere zu entfernen entspricht.