552 Stimmen

Regex Vorausschau, Nachschau und atomare Gruppen

Ich habe diese Dinge in meinem Regex Body gefunden, aber ich habe keine Ahnung, wofür ich sie verwenden kann. Hat jemand Beispiele, damit ich versuchen kann, zu verstehen, wie sie funktionieren?

(?!) - negative lookahead
(?=) - positive lookahead
(?<=) - positive lookbehind
(?<!) - negative lookbehind

(?>) - atomic group

1616voto

skyfoot Punkte 20503

Beispiele

Angesichts der Zeichenkette foobarbarfoo :

bar(?=bar)     finds the 1st bar ("bar" which has "bar" after it)
bar(?!bar)     finds the 2nd bar ("bar" which does not have "bar" after it)
(?<=foo)bar    finds the 1st bar ("bar" which has "foo" before it)
(?<!foo)bar    finds the 2nd bar ("bar" which does not have "foo" before it)

Sie können sie auch kombinieren:

(?<=foo)bar(?=bar)    finds the 1st bar ("bar" with "foo" before it and "bar" after it)

Definitionen

Positiv in die Zukunft blicken (?=)

Finden Sie den Ausdruck A, auf den der Ausdruck B folgt:

A(?=B)

Negativ in die Zukunft blicken (?!)

Finde den Ausdruck A, aus dem der Ausdruck B nicht folgt:

A(?!B)

Positiv zurückblicken (?<=)

Finde den Ausdruck A, dem der Ausdruck B vorausgeht:

(?<=B)A

Blicken Sie hinter negative (?<!)

Finde den Ausdruck A, dem der Ausdruck B nicht vorausgeht:

(?<!B)A

Atomare Gruppen (?>)

Eine atomare Gruppe verlässt eine Gruppe und verwirft alternative Muster, nachdem die erste übereinstimmendes Muster innerhalb der Gruppe (Rückverfolgung ist deaktiviert).

  • (?>foo|foot)s angewendet auf foots wird mit seiner 1. Alternative übereinstimmen foo , dann scheitern als s nicht unmittelbar folgt und anhält, da das Backtracking deaktiviert ist

Eine nicht-atomare Gruppe erlaubt eine Rückverfolgung; wenn der nachfolgende Abgleich fehlschlägt, wird er zurückverfolgt und alternative Muster verwendet, bis eine Übereinstimmung für den gesamten Ausdruck gefunden wird oder alle Möglichkeiten ausgeschöpft sind.

  • (foo|foot)s angewendet auf foots wird:

    1. seiner 1. Alternative entsprechen foo , dann scheitern als s folgt nicht unmittelbar in foots und zurück zu seiner 2. Alternative;
    2. mit seiner 2. Alternative übereinstimmen foot dann erfolgreich als s folgt unmittelbar in foots und stoppen.

Einige Ressourcen

Online-Tester

248voto

Amarghosh Punkte 56804

Lookarounds sind Behauptungen mit Nullbreite. Sie suchen nach einem Regex (rechts oder links von der aktuellen Position - basierend auf "vor" oder "hinter"), sind erfolgreich oder nicht erfolgreich, wenn eine Übereinstimmung gefunden wird (basierend darauf, ob sie positiv oder negativ ist) und verwerfen den übereinstimmenden Teil. Sie verbrauchen kein Zeichen - der Abgleich für die nachfolgende Regex (falls vorhanden) beginnt an der gleichen Cursorposition.

Lesen Sie regelmäßiger-ausdruck.info für weitere Einzelheiten.

  • Positive Vorausschau:

Syntax:

(?=REGEX_1)REGEX_2

Übereinstimmung nur, wenn REGEX_1 übereinstimmt; nach der Übereinstimmung mit REGEX_1 wird die Übereinstimmung verworfen und die Suche nach REGEX_2 beginnt an derselben Position.

Beispiel:

(?=[a-z0-9]{4}$)[a-z]{1,2}[0-9]{2,3}

REGEX_1 ist [a-z0-9]{4}$ die auf vier alphanumerische Zeichen, gefolgt von einem Zeilenende, passt.
REGEX_2 ist [a-z]{1,2}[0-9]{2,3} die einem oder zwei Buchstaben, gefolgt von zwei oder drei Ziffern, entspricht.

REGEX_1 stellt sicher, dass die Länge der Zeichenfolge tatsächlich 4 beträgt, verbraucht aber keine Zeichen, so dass die Suche nach REGEX_2 an derselben Stelle beginnt. Jetzt stellt REGEX_2 sicher, dass die Zeichenkette einigen anderen Regeln entspricht. Ohne Vorausschau würde sie auf Zeichenketten der Länge drei oder fünf passen.

  • Negative Vorausschau

Syntax:

(?!REGEX_1)REGEX_2

Übereinstimmung nur, wenn REGEX_1 nicht übereinstimmt; nach der Überprüfung von REGEX_1 beginnt die Suche nach REGEX_2 an derselben Stelle.

Beispiel:

(?!.*\bFWORD\b)\w{10,30}$

Der Vorausschau-Teil prüft, ob die FWORD in der Zeichenkette und schlägt fehl, wenn er sie findet. Wenn sie nicht gefunden wird FWORD ist die Vorausschau erfolgreich, und der folgende Teil überprüft, ob die Länge der Zeichenfolge zwischen 10 und 30 liegt und ob sie nur Wortzeichen enthält a-zA-Z0-9_

Look-behind ist ähnlich wie look-ahead: Es schaut nur hinter die aktuelle Cursorposition. Einige Regex-Varianten wie Javascript unterstützen keine Look-Behind-Assertions. Und die meisten Flavors, die sie unterstützen (PHP, Python usw.), verlangen, dass der look-behind-Teil eine feste Länge hat.

  • Atomic groups verwirft/vergisst grundsätzlich die nachfolgenden Token in der Gruppe, sobald ein Token passt. Auf dieser Seite finden Sie Beispiele für Atomare Gruppen

2voto

Grimley Punkte 107

Warum - Angenommen, du spielst Wordle und hast "Ameise" eingegeben. (Ja, ein Wort mit drei Buchstaben, es ist nur ein Beispiel - chill)

Die Antwort lautet "leer", "gelb", "grün", und Sie haben eine Liste von Wörtern mit drei Buchstaben, nach denen Sie mit einer Regex suchen möchten? Wie würden Sie das machen?

Für den Anfang könnte man mit dem Vorhandensein des t in der dritten Position beginnen:

[a-z]{2}t

Wir könnten uns verbessern, indem wir feststellen, dass wir kein a

[b-z]{2}t

Wir könnten noch besser werden, indem wir sagen, dass die Suche ein n enthalten muss.

(?=.*n)[b-z]{2}t

oder sie aufzuschlüsseln;

(?=.*n) - Schauen Sie nach vorne und prüfen Sie, ob die Übereinstimmung ein n enthält, sie kann null oder mehr Zeichen vor diesem n haben

[b-z]{2} - Zwei Buchstaben außer einem "a" an den ersten beiden Stellen;

t - buchstäblich ein 't' in der dritten Position

0voto

AbstProcDo Punkte 17041

Schnelles Umschauen.
Wie unterscheidet man Vorausschau und Nachschau? Machen Sie eine 2-minütige Tour mit mir:

(?=) - positive lookahead
(?<=) - positive lookbehind

Angenommen,

    A  B  C #in a line

Jetzt fragen wir B: Wo bist du?
B hat zwei Lösungen, um seinen Standort zu deklarieren:

Erstens, B hat A vor sich und lässt C bebinden
Zweitens: B liegt vor (vorausschauend) C und hinter (zurückschauend) A.

Wie wir sehen können, sind das Hinter- und das Vorderteil in den beiden Lösungen entgegengesetzt.
Regex ist Lösung Zwei.

-1voto

Golden Lion Punkte 2590

Ich habe "look behind" verwendet, um das Schema zu finden, und "look ahead negative", um fehlende Tabellen mit (nolock) zu finden

expression="(?<=DB\.dbo\.)\w+\s+\w+\s+(?!with\(nolock\))"

matches=re.findall(expression,sql)
for match in matches:
    print(match)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X