Ich konnte keinen richtigen regulären Ausdruck finden, der mit einem String übereinstimmt, der nicht mit einer Bedingung endet. Zum Beispiel möchte ich nichts abgleichen, das mit einem endet a
.
Das passt
b
ab
1
Das passt nicht zusammen
a
ba
Ich weiß, dass der $
reguläre Ausdruck mit enden sollte , um das Ende zu markieren, obwohl ich nicht weiß, was davor stehen soll.
Bearbeiten : Die ursprüngliche Frage scheint kein legitimes Beispiel für meinen Fall zu sein. Also: Wie gehe ich mit mehr als einem Charakter um? Sagen Sie etwas, das nicht endet ab
?
Ich konnte dies mithilfe dieses Threads beheben :
.*(?:(?!ab).).$
Der Nachteil dabei ist, dass es nicht mit einer Zeichenfolge aus einem Zeichen übereinstimmt.
Antworten:
Sie geben uns nicht die Sprache, aber wenn Ihre Unterstützung für Regex-Aromen hinter der Behauptung steckt , brauchen Sie Folgendes:
(?<!a)
ist eine negierte Lookbehind-Behauptung, die sicherstellt, dass vor dem Ende der Zeichenfolge (oder Zeile mitm
Modifikator) nicht das Zeichen "a" steht.Sehen Sie es hier auf Regexr
Sie können dies auch problemlos mit anderen Zeichen erweitern, da diese nach der Zeichenfolge suchen und keine Zeichenklasse sind.
Dies würde mit allem übereinstimmen, was nicht mit "ab" endet , siehe Regexr
quelle
Verwenden Sie das Symbol not (
^
):Wenn Sie das
^
Symbol am Anfang von Klammern setzen, bedeutet dies "alles außer den Dingen in Klammern".$
ist einfach ein Anker bis zum Ende.Fügen Sie für mehrere Zeichen einfach alle in ihren eigenen Zeichensatz ein:
quelle
ae
odercb
.Um nach Dateien zu suchen, die nicht mit ".tmp" enden, verwenden wir den folgenden regulären Ausdruck:
Getestet mit dem Regex Tester ergibt folgendes Ergebnis:
quelle
^.*(?![.]tmp$)
nicht?.*
stimmt bereits mit der gesamten Zeichenfolge überein, sodass der verbleibende Ausschluss nicht mehr funktioniert.Der obige reguläre Ausdruck stimmt mit Zeichenfolgen überein, die nicht mit enden
a
.quelle
Versuche dies
Das
[]
bezeichnet eine Zeichenklasse und das^
invertiert die Zeichenklasse so, dass sie mit allem außer einem übereinstimmta
.quelle
Die Frage ist alt, aber ich konnte keine bessere Lösung finden, die ich hier poste. Suchen Sie alle USB-Laufwerke, ohne die Partitionen aufzulisten , und entfernen Sie so den "Teil [0-9]" aus den Ergebnissen. Am Ende habe ich zwei Grep gemacht, der letzte negiert das Ergebnis:
Dies führt zu meinem System:
Wenn ich nur die Partitionen haben möchte, könnte ich Folgendes tun:
Woher ich komme:
Und wenn ich es tue:
Ich bekomme:
quelle
Die akzeptierte Antwort ist in Ordnung, wenn Sie Lookarounds verwenden können. Es gibt jedoch auch einen anderen Ansatz, um dieses Problem zu lösen.
Wenn wir uns den weit verbreiteten regulären Ausdruck für diese Frage ansehen:
.*[^a]$
Wir werden feststellen, dass es fast funktioniert. Es wird keine leere Zeichenfolge akzeptiert, was möglicherweise etwas unpraktisch ist. Dies ist jedoch ein kleines Problem, wenn es sich nur um ein Zeichen handelt. Wenn wir jedoch eine ganze Zeichenfolge ausschließen möchten, z. B. "abc", dann:
.*[^a][^b][^c]$
geht nicht. Zum Beispiel wird AC nicht akzeptiert.
Es gibt jedoch eine einfache Lösung für dieses Problem. Wir können einfach sagen:
.{,2}$|.*[^a][^b][^c]$
oder allgemeinere Version:
.{,n-1}$|.*[^firstchar][^secondchar]$
wobei n Länge der Zeichenfolge , die Sie verbieten möchten (abc
es 3 ist) undfirstchar
,secondchar
, ... sind erste, zweite ... n - te Zeichen der Zeichenfolge (fürabc
sie wärea
, dannb
, dannc
).Dies ergibt sich aus einer einfachen Beobachtung, dass eine Zeichenfolge, die kürzer als der Text ist, den wir nicht verbieten, diesen Text per Definition nicht enthalten kann. Wir können also entweder alles akzeptieren, was kürzer ist ("ab" ist nicht "abc"), oder alles, was lang genug ist, um es zu akzeptieren, aber ohne das Ende.
Hier ist ein Beispiel für eine Suche, mit der alle Dateien gelöscht werden, die nicht .jpg sind:
find . -regex '.{,3}$|.*[^.][^j][^p][^g]$' -delete
quelle
.{,2}$|.*[^a][^b][^c]$
stimmt nicht übereinccc
Alles, was mit etwas übereinstimmt, das mit einem --- endet.
.*a$
Wenn Sie also mit dem regulären Ausdruck übereinstimmen, negieren Sie die Bedingung, oder Sie können alternativ auch tun,.*[^a]$
wo[^a]
alles bedeutet, was istnot a
quelle
Wenn Sie verwenden
grep
odersed
die Syntax wird ein wenig anders sein. Beachten Sie, dass die sequentielle[^a][^b]
Methode hier nicht funktioniert:FWIW, ich finde die gleichen Ergebnisse in Regex101 , was meiner Meinung nach JavaScript-Syntax ist.
Schlecht: https://regex101.com/r/MJGAmX/2
Gut: https://regex101.com/r/LzrIBu/2
quelle