Laden...

Alle Wörter beginnend mit einem @ aus String extrahieren

Erstellt von Rioma vor 8 Jahren Letzter Beitrag vor 8 Jahren 1.240 Views
R
Rioma Themenstarter:in
228 Beiträge seit 2013
vor 8 Jahren
Alle Wörter beginnend mit einem @ aus String extrahieren

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

16.842 Beiträge seit 2008
vor 8 Jahren

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 == '_' ) );
}
R
Rioma Themenstarter:in
228 Beiträge seit 2013
vor 8 Jahren

Danke du hast Recht. Definitiv die bessere Lösung!

49.485 Beiträge seit 2005
vor 8 Jahren

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