Regulärer Ausdruck, um doppelte Wörter zu finden und zu entfernen

7

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", "."

    
triniMahn 29.06.2009, 14:55
quelle

9 Antworten

12

Wie von anderen gesagt, brauchen Sie mehr als eine Regex, um die Wörter im Auge zu behalten:

%Vor%     
Per Erik Stendahl 29.06.2009, 15:12
quelle
10

Das scheint bei mir zu funktionieren

%Vor%

Übereinstimmungen wie so

%Vor%     
Jeff Atwood 31.07.2009 11:52
quelle
4

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.

    
chaos 29.06.2009 15:00
quelle
2

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 ...

    
tanascius 29.06.2009 15:02
quelle
1

Reguläre Ausdrücke wären eine schlechte Wahl von "Werkzeugen", um dieses Problem zu lösen. Vielleicht könnte folgendes funktionieren:

%Vor%

EDIT: Das ist für mich eine große Annahme, dass Sie für irgendeine Art von Analyse wie Suchen "lexen".

    
user7116 29.06.2009 15:14
quelle
0

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.

    
Tobias Hertkorn 29.06.2009 15:05
quelle
0
  

Manche Leute denken, wenn sie mit einem Problem konfrontiert werden: "Ich weiß, ich werde es benutzen   reguläre Ausdrücke. "Jetzt haben sie zwei Probleme.

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.

    
Ian Ringrose 31.07.2009 12:04
quelle
-1

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.

    
Matt Bridges 29.06.2009 15:14
quelle
-2

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.

    
arnsholt 29.06.2009 15:11
quelle

Tags und Links