Ich bin ein Neuling mit regulären Ausdrücken, und ich kann nicht genau herausfinden, wie man einen einzelnen regulären Ausdruck schreibt, der mit doppelten aufeinanderfolgenden Wörtern "übereinstimmt", wie z.
Paris in der der Frühling.
Nicht , dass das damit zusammenhängt.
Warum lachst du? Sind meine regulären Ausdrücke so schlecht?
Gibt es einen einzelnen regulären Ausdruck, der mit ALLEN fettgedruckten Zeichenfolgen oben übereinstimmt?
regex
duplicates
capture-group
Joshua
quelle
quelle
not that that is related
->not that is related
)? Vielen Dank im Voraus\1
!\b(\w+)\s+(\1\s*)+\b
?Antworten:
Versuchen Sie diesen regulären Ausdruck:
Hier
\b
ist eine Wortgrenze und\1
verweist auf die erfasste Übereinstimmung der ersten Gruppe.quelle
\0
? (Wo\0
ist die ganze Regex, bis zum aktuellen Punkt ODER wo\0
bezieht sich auf die ganze Regex)Ich glaube, dieser reguläre Ausdruck behandelt mehr Situationen:
Eine gute Auswahl an Testzeichenfolgen finden Sie hier: http://callumacrae.github.com/regex-tuesday/challenge1.html
quelle
<strong>\0</strong>
aber nicht funktioniert.$1 <strong>$2</strong>
. Verwenden Sie aber auch andere Regex/\b(\S+) (\1)\b/gi
. Hier ist ein Link: callumacrae.github.io/regex-tuesday/…<p class="bebe">bla bla</p>
wie kann ich diese Regex-Formel integrieren?Versuchen Sie dies mit unten RE
() * Wiederholen
quelle
Die weit verbreitete PCRE - Bibliothek kann solche Situationen bewältigen (Sie werden nicht erreichen , die das gleiche mit POSIX-kompatibelen regex Motoren, obwohl):
quelle
\W+
.\b
wird es nicht tun, weil es keine Zeichen verbraucht.... the these problems...
. Diese Lösung ist nicht so zuverlässig wie die allgemeine Struktur von Gumbos Muster, die Wortgrenzen ausreichend implementiert.<p class="bebe">bla bla</p>
wie kann ich diese Regex-Formel integrieren?Dies ist der reguläre Ausdruck, mit dem ich doppelte Phrasen in meinem zuckenden Bot entferne:
(\S+\s*)
sucht nach Zeichenfolgen, die keine Leerzeichen sind, gefolgt von Leerzeichen.\1{2,}
sucht dann nach mehr als 2 Instanzen dieser Phrase in der Zeichenfolge, die übereinstimmen. Wenn 3 Sätze identisch sind, stimmt sie überein.quelle
\s*
in der Erfassungsgruppe. Siehe diese Demonstration: regex101.com/r/JtCdd6/1I said "oioioi" that's some wicked mistressship!
amoioioi
undsss
Nein, das ist eine unregelmäßige Grammatik. Möglicherweise gibt es motor- / sprachspezifische reguläre Ausdrücke, die Sie verwenden können, aber es gibt keinen universellen regulären Ausdruck, der dies kann.
quelle
Hier ist eine, die mehrere Wörter mehrmals fängt:
quelle
<p class="bebe">bla bla</p>
wie kann ich diese Regex-Formel integrieren?<p class="bebe">.*?\b\s+(\w+)\b\K\s+\1\s+\b(?=.*?<\/p>)
Regex to Strip 2+ doppelte Wörter (aufeinanderfolgende / nicht aufeinanderfolgende Wörter)
Versuchen Sie diesen regulären Ausdruck, der zwei oder mehr doppelte Wörter erfassen und nur ein einziges Wort zurücklassen kann. Und die doppelten Wörter müssen nicht einmal aufeinanderfolgend sein .
Hier
\b
wird für die Wortgrenze verwendet,?=
wird für einen positiven Lookahead verwendet und\1
wird für die Rückreferenzierung verwendet.Beispiel Quelle
quelle
"the cat sat on the mat"
->" cat sat on the mat"
Der folgende Ausdruck sollte korrekt funktionieren, um eine beliebige Anzahl aufeinanderfolgender Wörter zu finden. Bei der Zuordnung kann die Groß- und Kleinschreibung nicht berücksichtigt werden.
Beispieleingabe: Auf Wiedersehen Auf Wiedersehen GooDbYe
Beispielausgabe: Auf Wiedersehen
Erläuterung:
Der Regex-Ausdruck:
\ b: Beginn einer Wortgrenze
\ w +: Beliebig viele Wortzeichen
(\ s + \ 1 \ b) *: Beliebige Anzahl von Leerzeichen, gefolgt von Wörtern, die mit dem vorherigen Wort übereinstimmen und die Wortgrenze beenden. Das Ganze in * hilft, mehr als eine Wiederholung zu finden.
Gruppierung:
m.group (0): Enthält im obigen Fall die übereinstimmende Gruppe. Auf Wiedersehen, auf Wiedersehen, GooDbYe
m.group (1): Enthält im obigen Fall das erste Wort des übereinstimmenden Musters. Auf Wiedersehen
Die Ersetzungsmethode ersetzt alle aufeinanderfolgenden übereinstimmenden Wörter durch die erste Instanz des Wortes.
quelle
Das Beispiel in Javascript: Die guten Teile können dazu angepasst werden:
\ b verwendet \ w für Wortgrenzen, wobei \ w [0-9A-Z_a-z] entspricht. Wenn Ihnen diese Einschränkung nichts ausmacht, ist die akzeptierte Antwort in Ordnung.
quelle
Da einige Entwickler auf dieser Seite nach einer Lösung suchen, die nicht nur doppelte aufeinanderfolgende Nicht-Leerzeichen-Teilzeichenfolgen, sondern auch dreifache und darüber hinaus eliminiert, zeige ich das angepasste Muster.
Pattern:
/(\b\S+)(?:\s+\1\b)+/
( Pattern Demo )Replace:
$1
(ersetzt das Fullstring Match durch Capture Group # 1)Dieses Muster stimmt gierig mit einem "ganzen" Nicht-Leerzeichen-Teilstring überein und erfordert dann eine oder mehrere Kopien des übereinstimmenden Teilstrings, die durch ein oder mehrere Leerzeichen (Leerzeichen, Tabulator, Zeilenumbruch usw.) begrenzt sein können.
Speziell:
\b
(Wortgrenzen-) Zeichen sind wichtig, um sicherzustellen, dass Teilwörter nicht übereinstimmen.+
(ein oder mehrere Quantifizierer) in der nicht erfassenden Gruppe ist besser geeignet, als*
weil er*
die Regex-Engine "stört", um Singleton-Vorkommen zu erfassen und zu ersetzen - dies ist ein verschwenderisches Musterdesign.* Beachten Sie, dass das Muster weiter verfeinert werden muss, wenn Sie mit Sätzen oder Eingabezeichenfolgen mit Interpunktion arbeiten.
quelle
Dieser Ausdruck (inspiriert von Mike oben) scheint alle Duplikate, Triplikate usw. zu erfassen, einschließlich der am Ende der Zeichenfolge, was die meisten anderen nicht tun:
Ich kenne die Frage, die gestellt wird, um nur Duplikate abzugleichen, aber ein Dreifach besteht nur aus 2 Duplikaten nebeneinander :)
Zuerst stelle
(^|\s+)
ich sicher, dass es mit einem vollständigen Wort beginnt, sonst würde "Kindersteak" zu "Kindersteak" gehen (die "s" würden übereinstimmen). Dann stimmt es mit allen vollständigen Wörtern ((\b\S+\b)
) überein , gefolgt von einem Ende von string ($
) oder einer Anzahl von Leerzeichen (\s+
), wobei das Ganze mehr als einmal wiederholt wird.Ich habe es so versucht und es hat gut funktioniert:
quelle
\b
am Ende Folgendes hinzugefügt habe:/(^|\s+)(\S+)(($|\s+)\2)+\b/g, "$1$2")
Dies funktioniert dann für Situationen wie diese:the the string String string stringing the the along the the string
wird zurthe string stringing the along the string
Notizstring stringing
. Es wird mit Ihrer Antwort abgeglichen. Danke dir.Verwenden Sie diese Option, wenn Sie nicht zwischen Groß- und Kleinschreibung suchen und nach doppelten Wörtern suchen möchten.
quelle