Mit regulären Ausdrücken in C # gibt es eine Möglichkeit, doppelte Wörter oder Symbole in einer Zeichenfolge zu finden und zu entfernen, die eine Vielzahl von Wörtern und Symbolen enthält?
Beispiel
Anfangszeichenfolge:
"Ich mag die Umgebung. Die Umgebung ist gut."
Gewünschte Zeichenfolge:
"Ich mag die Umgebung. Ist gut"
Duplikate entfernt: "the", "environment", "."
Wie von anderen gesagt, brauchen Sie mehr als eine Regex, um die Wörter im Auge zu behalten:
%Vor%Das scheint bei mir zu funktionieren
%Vor%Übereinstimmungen wie so
%Vor%Nun, Jeff hat mir gezeigt, wie ich die Magie von In-Expression-Rückwärtsreferenzen und den globalen Modifikator nutzen kann, um dies zu erreichen, so dass meine ursprüngliche Antwort nicht funktioniert. Sie sollten alle für Jeffs Antwort stimmen. Aber für die Nachwelt werde ich bemerken, dass es in diesem Fall ein schwieriges kleines Regex-Engine-Sensitivitätsproblem gibt, und wenn Sie Perl-artigen Regex verwenden würden, müssten Sie dies tun:
%Vor% anstelle von Jeffs Antwort, weil C # 's Regex \b
in effektiv erfasst, PCRE aber nicht.
Schauen Sie sich Rückreferenzen an:
Ссылка
Dies ist eine Regex, die doppelte Wörter finden wird. Aber es wird nur ein Wort pro Spiel übereinstimmen. Also musst du es mehr als einmal benutzen.
%Vor%Natürlich ist das nicht die beste Lösung (siehe andere Antworten, die vorschlagen, überhaupt keine Regex zu verwenden). Aber du hast nach einer Regex gefragt - hier ist eine. Vielleicht hilft dir nur die Idee ...
Regex ist nicht für alles geeignet. So etwas wie dein Problem fällt in diese Kategorie. Ich würde empfehlen, stattdessen einen Parser zu verwenden.
Siehe Wenn Regex nicht verwendet werden soll C # (oder Java, C ++ usw.)
Natürlich kann die Verwendung eines Regex zur Aufteilung der Zeichenkette in Wörter ein nützlicher erster Schritt sein, jedoch ist String.Split () klar und es ist schlau, alles zu tun, was Sie brauchen.
Sie können keine regulären Ausdrücke für dieses Problem verwenden, da Regex nur mit regulären Sprachen übereinstimmt. Das Muster, das Sie abgleichen möchten, ist kontextsensitiv und daher nicht "normal".
Glücklicherweise ist es einfach genug, einen Parser zu schreiben. Schauen Sie sich den Code von Per Erik Stendahl an.
Wie andere darauf hingewiesen haben, ist dies mit Rückreferenzen machbar. Siehe Ссылка für Details zur Verwendung von Rückwärtsreferenzen in .Net.
Ihr spezielles Problem, Interpunktion zu entfernen, macht es auch ein wenig komplizierter, aber ich denke Code in diesen Zeilen (Whitespace ist nicht wichtig in dieser Regex) sollte den Trick tun:
%Vor%Ich habe die Regex überhaupt nicht getestet, aber das sollte mit einem oder mehreren Wörtern übereinstimmen, die durch Leerzeichen getrennt sind. Sie müssen etwas mehr Logik hinzufügen, um die Punktierung zu ermöglichen und so weiter.