Hallo zusammen,
ist es möglich in einem String alle Wörter beginnend mit einem @ zu extrahieren? Die Wörter enden mit einem Komma oder einem Leerzeichen. Enthalten sein kann a-zA-Z oder ein _.
Ich habe mit einem Regex-Tester mal ein bisschen rumprobiert, bin aber bisher zu keiner Lösung gekommen.
Mit "@([_a-zA-Z]+)" erhalte ich das was ich möchte, allerdings immer nur das erste Wort
Könnte mir jemand noch einen Tipp geben, wie ich wirklich alle Wörter extrahieren kann?
Danke
EDIT:
Wenn man den (g)lobal mode nimmt, dann klappt es auch....
Danke
Und warum splittest Du nicht den String auf Whitespace bzw. Komma und untersuchst dann einfach jedes Wort mit StartsWith
()? Und den Code versteht jeder, was bei Regex leider oft nicht so ist.
Wird - meine Vermutung - um Welten schneller sein. Und selbst jedes Char dann noch zu überprüfen glaube ich nicht, dass es langsamer wäre (da es insgesamt sogar dann optional parallelisierbar ist).
(hier im Editor geschrieben)
public static IEnumerable<string> YourFilter( string val )
{
return val.Split( ' ', ',' )
.Where( word => word.StartsWith( "@" ) )
.Where( word => word.Substring(1).ToCharArray().All( c => Char.IsLetter( c ) || c == '_' ) );
}
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hallo Rioma,
zur eigentlichen Frage: verwende Regex.Matches statt Regex.Match.
Im konkreten Fall mag nativer Code lesbarer sein als Regex, aber auch das nur für Leute, die kein Regex können. Im allgemeinen halte ich es für eine schlechte Idee, Regex-Pattern als nativen Code auszuprogrammieren. Einen konkreten Vergleich gibt es in Das Programmier-Spiel: nette Übungsaufgaben für zwischendurch und den folgenden Beiträgen.
Auch in dem Beispiel hier bekommt man ja schon einen Eindruck, wie viel länger der native Code als der Pattern wird. Bei komplexeren Pattern, die zugegeben auch nicht einfach zu lesen sind, erschlägt einen dann schon die reine Menge des ausprogrammierten Codes.
Änderungen oder Feintuning an einem Pattern sind üblicherweise viel leichter vorzunehmen als im ausprogrammieren Code. Zu diesem Ergebnis kommt jedenfalls dN!3L, der die Aufgabe im Programmierspiel gelöst hat. Ausprogrammierten Code muss man möglicherweise sogar komplett umschmeißen, wo man in Regex mit einer kleinen Änderung auskommt.
herbivore