Frage

Bei dem folgenden Code ein:

var myList = new List<string> { "red shirt", "blue", "green", "red" };
Regex r = new Regex("\\b(" + string.Join("|", myList.ToArray()) + ")\\b");
MatchCollection m = r.Matches("Alfred has a red shirt and blue tie");

Ich mag das Ergebnis m enthalten "red shirt", "blue", "red" da alle in der Kette ist, aber ich bin nur "red shirt", "blue" bekommen. Was kann ich tun Überschneidungen enthalten?

War es hilfreich?

Lösung

Es scheint mir, dass die regexp-Parser den Matchstring, sobald die erste gültige Übereinstimmung gefunden wird, zu entfernen. Ich habe keine Windows-Compiler-Setup jetzt so ich keine Äpfel mit Äpfeln Vergleich geben kann, aber ich sehe, ähnliche Ergebnisse in Perl.

Ich denke, Ihre Regex wie folgt aussehen würde, nachdem verbunden werden.

'\ b (rotes T-Shirt | blau | grün | rot) \ b'

Test dieses regexp heraus, dass ich das gleiche Ergebnis wie „rotes T-Shirt“, „blau“ zu sehen. Mit dem „roten Hemd“ bis zum Ende der regulären Ausdrucks Liste zu bewegen.

'\ b (rot | blau | grün | rotes Hemd) \ b'

ich jetzt sehen "rot", "blau".

Durch den regulären Ausdruck ein wenig ein komplizierterer Ansatz zu verändern könnten Sie in der Lage sein, die Ergebnisse zu erzielen, die Sie wollen.

\ b (blau | grün | (rot) Shirt) \ b

Dies sollte auch eine eigene Untergruppe und rotes T-Shirt als eine Gruppe rotes Spiel.

Returns "rotes T-Shirt", "rot", "blau"

Die einfachere Art und Weise zu tun, um eine Schleife durch Ihre Liste von Strings sein würde und 1 zu einer Zeit entsprechen, wenn Sie viele Wortgruppen haben wollen, die mehrere Übereinstimmungen wie Rot und rotes T-Shirt benötigen.

Da gibt es so viele Möglichkeiten gibt, regexp zu tun, ich bin wahrscheinlich eine offensichtliche und elegante Lösung fehlt.

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