Der OP hat den Beitrag nicht spezifiziert oder Tag um den Kontext (Programmiersprache, Editor, Tool) anzugeben, in dem das Regex verwendet werden soll.
Für mich muss ich manchmal beim Bearbeiten einer Datei mit Textpad
dies tun.
Textpad
unterstützt einige Regex, unterstützt jedoch kein Lookahead oder Lookbehind, daher sind mehrere Schritte erforderlich.
Wenn ich alle Zeilen behalten möchte, die nicht den Text hede
enthalten, würde ich es folgendermaßen tun:
1. Durchsuchen/Ersetzen der gesamten Datei, um am Anfang jeder Zeile mit Text eine eindeutige "Tag" hinzuzufügen.
Suchstring:^(.)
Ersetzungsstring:<@#-unique-#@>\1
Alle ersetzen
2. Löschen aller Zeilen, die den Text hede
enthalten (Ersetzungsstring ist leer):
Suchstring:<@#-unique-#@>.*hede.*\n
Ersetzungsstring:
Alle ersetzen
3. Zu diesem Zeitpunkt enthalten alle verbleibenden Zeilen nicht den Text hede
. Entfernen Sie den eindeutigen "Tag" aus allen Zeilen (Ersetzungsstring ist leer):
Suchstring:<@#-unique-#@>
Ersetzungsstring:
Alle ersetzen
Jetzt haben Sie den Originaltext, bei dem alle Zeilen mit dem Text hede
entfernt wurden.
Wenn ich Etwas Anderes tun möchte, jedoch nur für Zeilen, die nicht den Text hede
enthalten, würde ich es folgendermaßen tun:
1. Durchsuchen/Ersetzen der gesamten Datei, um am Anfang jeder Zeile mit Text eine eindeutige "Tag" hinzuzufügen.
Suchstring:^(.)
Ersetzungsstring:<@#-unique-#@>\1
Alle ersetzen
2. Für alle Zeilen, die den Text hede
enthalten, entfernen Sie den eindeutigen "Tag":
Suchstring:<@#-unique-#@>(.*hede)
Ersetzungsstring:\1
Alle ersetzen
3. Zu diesem Zeitpunkt enthalten alle Zeilen, die mit dem eindeutigen "Tag" beginnen, nicht den Text hede
. Ich kann nun mein Etwas Anderes nur auf diese Zeilen anwenden.
4. Wenn ich fertig bin, entferne ich den eindeutigen "Tag" aus allen Zeilen (Ersetzungsstring ist leer):
Suchstring:<@#-unique-#@>
Ersetzungsstring:
Alle ersetzen
108 Stimmen
Wahrscheinlich ein paar Jahre zu spät, aber was ist falsch mit:
([^h]*(h([^e]|$)|he([^d]|$)|hed([^e]|$)))*
? Die Idee ist einfach. Fahren Sie mit dem Abgleich fort, bis Sie den Beginn des unerwünschten Strings sehen, und gleichen Sie dann nur in den N-1 Fällen ab, in denen der String nicht abgeschlossen ist (wobei N die Länge des Strings ist). Diese N-1 Fälle sind "h gefolgt von nicht-e", "he gefolgt von nicht-d" und "hed gefolgt von nicht-e". Wenn es Ihnen gelungen ist, diese N-1 Fälle zu bestehen, haben Sie den unerwünschten String erfolgreich nicht abgeglichen, sodass Sie erneut mit der Suche nach[^h]*
beginnen können.441 Stimmen
@stevendesu: Versuche dies für 'ein-sehr-sehr-langes-Wort' oder noch besser einen halben Satz. Viel Spaß beim Tippen. Übrigens, es ist fast unleserlich. Weiß nicht über den Leistungseinfluss.
14 Stimmen
@PeterSchuetze: Sicher ist es nicht schön für sehr sehr lange Wörter, aber es ist eine praktikable und korrekte Lösung. Obwohl ich keine Tests zur Leistung durchgeführt habe, würde ich mir vorstellen, dass es nicht allzu langsam ist, da die meisten nachfolgenden Regeln ignoriert werden, bis Sie ein h sehen (oder den ersten Buchstaben des Wortes, Satzes usw. sehen). Und Sie könnten den Regex-String für lange Zeichenfolgen leicht mithilfe iterativer Konkatenation generieren. Wenn es funktioniert und schnell generiert werden kann, ist Lesbarkeit wichtig? Dafür sind Kommentare da.
66 Stimmen
@stevendesu: Ich bin noch später dran, aber diese Antwort ist fast komplett falsch. Zum einen verlangt sie, dass das Subjekt "h" enthält, was es nicht sollte, da die Aufgabe lautet, "Zeilen abzugleichen, die ein bestimmtes Wort nicht enthalten". Lassen Sie uns annehmen, dass Sie die innere Gruppe optional machen wollten und dass das Muster verankert ist:
^([^h]*(h([^e]|$)|he([^d]|$)|hed([^e]|$))?)*$
. Dies scheitert, wenn Instanzen von "hede" von teilweisen Instanzen von "hede" wie in "hhede" vorausgehen.22 Stimmen
Diese Frage wurde zum Stack Overflow Regular Expression FAQ hinzugefügt, unter "Advanced Regex-Fu".
0 Stimmen
Verwandt: Regex: Übereinstimmung durch Ausschluss, ohne Vorwärtsblick - ist das möglich?