Ich benutze RegexBuddy, aber ich habe trotzdem Probleme mit dieser Sache: \
Ich verarbeite Zeile für Zeile eine Datei. Ich habe ein "Linienmodell" gebaut, das meinen Wünschen entspricht.
Jetzt möchte ich ein inverses Match machen ... dh ich möchte Linien mit einer Folge von 6 Buchstaben abgleichen, aber nur wenn diese sechs Buchstaben nicht Andrea sind , wie soll ich das machen?
EDIT: Ich werde das Programm schreiben, das diesen regulären Ausdruck verwendet. Ich weiß noch nicht, ob ich in Python oder PHP dieses Ding zuerst mache, um einen regulären Ausdruck zu lernen :) Es gibt verschiedene Arten von Zeilen, ich wollte regulären Ausdruck verwenden Um den Typ auszuwählen, an dem ich interessiert bin. Sobald ich diese Zeilen erhalten habe, muss ich einen anderen Filter anwenden, um nicht mit einem bekannten Wert übereinzustimmen. Ich brauche alle anderen, nicht das. Das (?! Nicht gewollt) funktioniert ganz gut, danke. :-)
Ich hoffe das klärt die Frage :)
quelle
Antworten:
Angenommen, Ihre Regexp-Engine unterstützt negative Lookaheads.
Bearbeiten: ..oder vielleicht möchten Sie lieber
[A-Za-z]{6}
anstelle von verwenden.{6}
Bearbeiten (erneut): Beachten Sie, dass Lookaheads und Lookbehinds im Allgemeinen nicht der richtige Weg sind, um eine Übereinstimmung mit regulären Ausdrücken "umzukehren". Regexps sind nicht wirklich für negative Übereinstimmungen eingerichtet, sondern überlassen dies der Sprache, mit der Sie sie verwenden.
quelle
Für Python / Java
http://www.lisnichenko.com/articles/javapython-inverse-regex.html
quelle
some text
die Zeile jedoch gestartet wird, wird das falsche Ergebnis zurückgegeben.?!
und nicht nur!
.Aktualisiert mit dem Feedback von Alan Moore
In PCRE und ähnlichen Varianten können Sie tatsächlich einen regulären Ausdruck erstellen, der mit jeder Zeile übereinstimmt, die keinen Wert enthält:
Dies wird als temperiertes gieriges Zeichen bezeichnet . Der Nachteil ist, dass es nicht gut funktioniert.
quelle
[\s\S]
, was nur in JavaScript nützlich ist) nach den zweiten Lookahead, und Sie brauchen den ersten nicht :^(?:(?!Andrea).)*$
.[\S\s]
? OP spricht von übereinstimmenden Zeilen, die kein "Andrea" -Wort enthalten. Es geht nicht darum zu überprüfen, ob die gesamte Zeichenfolge dieses Wort enthält. Vermisse ich etwasWelche Sprache benutzt du? Hierfür sind die Funktionen und die Syntax der Regex-Implementierung von Bedeutung.
Sie könnten Look-Ahead verwenden. Am Beispiel von Python
Um das aufzuschlüsseln:
(?! Andrea) bedeutet "Übereinstimmung, wenn die nächsten 6 Zeichen nicht" Andrea "sind"; wenn ja dann
\ w bedeutet ein "Wortzeichen" - alphanumerische Zeichen. Dies entspricht der Klasse [a-zA-Z0-9_]
\ w {6} bedeutet genau 6 Wortzeichen.
re.IGNORECASE bedeutet, dass Sie "Andrea", "andrea", "ANDREA" ausschließen ...
Eine andere Möglichkeit besteht darin, Ihre Programmlogik zu verwenden - verwenden Sie alle Zeilen, die nicht mit Andrea übereinstimmen, und durchlaufen Sie eine zweite Regex, um nach 6 Zeichen zu suchen. Oder prüfen Sie zuerst, ob mindestens 6 Wortzeichen vorhanden sind, und stellen Sie dann sicher, dass es nicht mit Andrea übereinstimmt.
quelle
Negative Lookahead-Behauptung
Dies ist nicht gerade eine umgekehrte Übereinstimmung, aber es ist das Beste, was Sie direkt mit Regex tun können. Nicht alle Plattformen unterstützen sie jedoch.
quelle
Wenn Sie dies in RegexBuddy tun möchten, gibt es zwei Möglichkeiten, eine Liste aller Zeilen abzurufen, die nicht mit einem Regex übereinstimmen.
Stellen Sie in der Symbolleiste des Testfensters den Testbereich auf "Zeile für Zeile" ein. Wenn Sie dies tun, wird unter der Schaltfläche Alle auflisten in derselben Symbolleiste ein Element Alle Zeilen ohne Übereinstimmungen auflisten angezeigt. (Wenn die Schaltfläche Alle auflisten nicht angezeigt wird, klicken Sie in der Hauptsymbolleiste auf die Schaltfläche Übereinstimmen.)
Im GREP-Bereich können Sie die Kontrollkästchen "zeilenbasiert" und "Ergebnisse invertieren" aktivieren, um eine Liste nicht übereinstimmender Zeilen in den Dateien abzurufen, die Sie durchsuchen.
quelle
(?!
ist in der Praxis nützlich. Obwohl genau genommen, ist ein Blick nach vorne kein regulärer Ausdruck, wie er mathematisch definiert ist.Sie können einen invertierten regulären Ausdruck manuell schreiben.
Hier ist ein Programm , um das Ergebnis automatisch zu berechnen. Das Ergebnis ist maschinell generiert, was normalerweise viel komplexer ist als das Schreiben von Hand. Aber das Ergebnis funktioniert.
quelle
Ich habe gerade diese Methode entwickelt, die zwar hardwareintensiv ist, aber funktioniert:
Sie können alle Zeichen, die mit dem regulären Ausdruck übereinstimmen, durch eine leere Zeichenfolge ersetzen.
Dies ist ein Oneliner:
notMatched = re.sub(regex, "", string)
Ich habe dies verwendet, weil ich gezwungen war, einen sehr komplexen regulären Ausdruck zu verwenden, und nicht herausfinden konnte, wie jeder Teil davon innerhalb einer angemessenen Zeitspanne invertiert werden kann.
Dies gibt nur das String-Ergebnis zurück, keine Match-Objekte!
quelle
In Perl können Sie tun
process ($ line) if ($ line = ~! / Andrea /);
quelle