it-swarm.com.de

Wie kann man mit Regex "invertieren"?

Ich benutze RegexBuddy, aber ich habe sowieso Probleme mit dieser Sache: \

Ich arbeite Zeile für Zeile eine Datei. Ich habe ein "Linienmodell" gebaut, das meinen Wünschen entspricht.

Nun würde ich gerne eine umgekehrte Übereinstimmung machen ... dh ich möchte Zeilen mit einer Zeichenfolge von 6 Buchstaben abgleichen, aber nur wenn diese sechs Buchstaben nicht Andrea sind, wie soll ich das tun Das?


EDIT: Ich schreibe das Programm, das diese Regex verwendet, ich weiß noch nicht, ob in Python oder PHP, ich mache dieses Ding zuerst, um etwas Regex zu lernen :) Es gibt verschiedene types Ich wollte regex verwenden, um den Typ auszuwählen, für den ich mich interessiere. Sobald ich diese Zeilen habe, muss ich einen anderen Filter anwenden, um nicht mit einem bekannten Wert übereinzustimmen. Ich brauche alle anderen, nicht das. Der (?! Nicht gewollte) funktioniert ziemlich gut, danke. :-)

Ich hoffe das klärt die Frage :)

89
Andrea Ambu
(?!Andrea).{6}

Angenommen, Ihre Regex-Engine unterstützt negative Lookaheads.

Edit: ..oder vielleicht möchten Sie lieber [A-Za-z]{6} anstelle von .{6} verwenden

Bearbeiten (erneut): Beachten Sie, dass Lookaheads und LookHindinds normalerweise nicht der richtige Weg sind, um eine Übereinstimmung mit regulären Ausdrücken "umzukehren". Regexps sind nicht wirklich für das Negativ-Matching eingerichtet, sie überlassen dies jeder Sprache, mit der Sie sie verwenden.

56
Dan
43
Dmytro

Aktualisiert mit Feedback von Alan Moore

In PCRE und ähnlichen Varianten können Sie tatsächlich einen Regex erstellen, der mit jeder Zeile übereinstimmt, die keinen Wert enthält:

^(?:(?!Andrea).)*$

Dies wird als temperiertes gieriges Zeichen bezeichnet. Der Nachteil ist, dass es nicht gut funktioniert.

15
Zenexer

Welche Sprache verwendest du? Die Fähigkeiten und die Syntax der Regex-Implementierung spielen hierfür eine Rolle.

Sie könnten Look-Ahead verwenden. Verwenden Sie Python als Beispiel

import re

not_andrea = re.compile('(?!Andrea)\w{6}', re.IGNORECASE)

Um das zu brechen:

(?! Andrea) bedeutet 'übereinstimmen, wenn die nächsten 6 Zeichen nicht "Andrea" sind'; wenn ja dann

\w bedeutet ein "Word-Zeichen" - alphanumerische Zeichen. Dies entspricht der Klasse [a-zA-Z0-9_]

\w {6} bedeutet genau 6 Word-Zeichen.

re.IGNORECASE bedeutet, dass Sie "Andrea", "andrea", "ANDREA" ausschließen ...

Eine andere Möglichkeit ist die Verwendung der Programmlogik. Verwenden Sie alle Zeilen, die nicht mit Andrea übereinstimmen, und legen Sie sie durch eine zweite Regex, um nach 6 Zeichen zu suchen. Oder prüfen Sie zuerst, ob mindestens 6 Word-Zeichen vorhanden sind, und prüfen Sie dann, ob es nicht mit Andrea übereinstimmt.

10
Hamish Downer

Negative Lookahead-Behauptung

(?!Andrea)

Dies ist kein genau umgekehrtes Match, aber es ist das Beste, was Sie direkt mit Regex tun können. Nicht alle Plattformen unterstützen sie jedoch.

5
Vinko Vrsalovic

Wenn Sie dies in RegexBuddy tun möchten, gibt es zwei Möglichkeiten, eine Liste aller Zeilen zu erhalten, die nicht mit einem regulären Ausdruck übereinstimmen.

Legen Sie in der Symbolleiste des Testfensters den Testbereich auf "Zeile für Zeile" fest. Wenn Sie dies tun, wird ein Element Alle Zeilen ohne Übereinstimmungen auflisten unter der Schaltfläche Alle auf der gleichen Symbolleiste angezeigt. (Wenn Sie die Schaltfläche Alle nicht anzeigen sehen, klicken Sie in der Hauptsymbolleiste auf die Schaltfläche Anpassen.)

Im GREP-Fenster können Sie die Kontrollkästchen "Zeilenbasiert" und "Ergebnisse umkehren" aktivieren, um eine Liste nicht übereinstimmender Zeilen in den Dateien anzuzeigen, die Sie durchgreifen.

4
Jan Goyvaerts

(?! ist in der Praxis nützlich . Vorausschauend ist der strikte Ausdruck 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 wird maschinell generiert, was normalerweise sehr viel komplexer ist als das Schreiben von Hand . Das Ergebnis funktioniert jedoch.

3
weakish

Ich habe mir gerade diese Methode ausgedacht, 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 invertiert werden kann.

Dies gibt nur das Ergebnis der Zeichenfolge zurück, keine Übereinstimmungsobjekte!

0