Ich suchte nach der Bedeutung dieser Ausdrücke, konnte aber den genauen Unterschied zwischen ihnen nicht verstehen. Das sagen sie:
?:
Ausdruck ausgleichen, aber nicht erfassen.?=
Passen Sie ein Suffix an, schließen Sie es jedoch von der Erfassung aus.?!
Übereinstimmung, wenn kein Suffix vorhanden ist.
Ich habe versucht, diese in einfachem RegEx zu verwenden, und habe für alle ähnliche Ergebnisse erzielt. Beispiel: Die folgenden 3 Ausdrücke ergeben sehr ähnliche Ergebnisse.
[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+(?!\.[a-zA-Z0-9]+)*
[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+(?=\.[a-zA-Z0-9]+)*
[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9]+)*
javascript
regex
RK Poddar
quelle
quelle
*
nach den Gruppen ein a hinzugefügt , damit sie einfach ignoriert werden.Antworten:
Der Unterschied zwischen
?=
und?!
besteht darin, dass der erstere erfordert, dass der angegebene Ausdruck übereinstimmt, und der letztere erfordert, dass er nicht übereinstimmt. Zum Beispiela(?=b)
wird das "a" in "ab" übereinstimmen, aber nicht das "a" in "ac". Wobeia(?!b)
das "a" in "ac" übereinstimmt, aber nicht das "a" in "ab".Der Unterschied zwischen
?:
und?=
besteht darin, dass?=
der Ausdruck von der gesamten Übereinstimmung ausgeschlossen wird, während?:
keine Erfassungsgruppe erstellt wird. So stimmt beispielsweisea(?:b)
das "ab" in "abc"a(?=b)
überein , während nur das "a" in "abc" übereinstimmt.a(b)
würde mit dem "ab" in "abc" übereinstimmen und ein Capture erstellen, das das "b" enthält.quelle
Bitte überprüfen Sie hier: http://www.regular-expressions.info/lookaround.html für ein sehr gutes Tutorial und Beispiele zu Lookahead in regulären Ausdrücken.
quelle
Zum besseren Verständnis wenden wir die drei Ausdrücke plus eine Erfassungsgruppe an und analysieren jedes Verhalten.
()
Erfassungsgruppe - Der reguläre Ausdruck in der Klammer muss übereinstimmen, und die Übereinstimmung muss eine Erfassungsgruppe erstellen(?:)
Nicht erfassende Gruppe - Der reguläre Ausdruck in der Klammer muss übereinstimmen, erstellt jedoch keine erfassende Gruppe(?=)
positiver Blick nach vorne - behauptet, dass der reguläre Ausdruck übereinstimmen muss(?!)
negativer Blick nach vorne - behauptet, dass es unmöglich ist, den regulären Ausdruck zu erreichenLassen Sie uns beantragen
q(u)i
, um zu beenden .q
stimmt mit q überein und die Erfassungsgruppeu
stimmt mit u überein . Die Übereinstimmung innerhalb der Erfassungsgruppe wird genommen und eine Erfassungsgruppe wird erstellt. Also geht der Motor weiteri
. Undi
passt auf i . Dieser letzte Matchversuch ist erfolgreich. qui wird abgeglichen und eine Erfassungsgruppe mit u erstellt.Lassen Sie uns beantragen
q(?:u)i
, um zu beenden . Wiederq
stimmt mit q überein und die nicht erfassende Gruppeu
stimmt mit u überein . Die Übereinstimmung aus der nicht erfassenden Gruppe wird übernommen, aber die erfassende Gruppe wird nicht erstellt. Also geht der Motor weiteri
. Undi
passt auf i . Dieser letzte Matchversuch ist erfolgreich. qui ist abgestimmtLassen Sie uns beantragen
q(?=u)i
, um zu beenden . Der Lookahead ist positiv und wird von einem weiteren Token gefolgt. Wiederq
stimmt mit q undu
mit u überein . Auch hier muss die Übereinstimmung vom Lookahead verworfen werden, damit der Motor voni
der Zeichenfolge zu u zurücktritt . Der Lookahead war erfolgreich, daher fährt der Motor forti
. Aberi
nicht mithalten können u . Dieser Matchversuch schlägt also fehl.Lassen Sie uns beantragen
q(?=u)u
, um zu beenden . Der Lookahead ist positiv und wird von einem weiteren Token gefolgt. Wiederq
stimmt mit q undu
mit u überein . Die Übereinstimmung vom Lookahead muss verworfen werden, damit der Motor vonu
der Zeichenfolge zurück zu u tritt . Der Lookahead war erfolgreich, daher fährt der Motor fortu
. Undu
passt auf u . Dieser Matchversuch ist also erfolgreich. qu ist abgestimmtLassen Sie uns beantragen
q(?!i)u
, um zu beenden . Auch in diesem Fall ist Lookahead positiv (weili
es nicht übereinstimmt) und wird von einem weiteren Token gefolgt. Wiederq
stimmt mit q überein undi
stimmt nicht mit u überein . Die Übereinstimmung vom Lookahead muss verworfen werden, damit der Motor vonu
der Zeichenfolge zurück zu u tritt . Der Lookahead war erfolgreich, daher fährt der Motor fortu
. Undu
passt auf u . Dieser Matchversuch ist also erfolgreich. qu ist abgestimmtZusammenfassend geht es also um den wirklichen Unterschied zwischen Lookahead- und Nicht-Capturing-Gruppen, wenn Sie nur die Existenz testen oder das Match testen und speichern möchten. Erfassungsgruppen sind teuer, verwenden Sie sie also mit Bedacht.
quelle
Versuchen Sie,
foobar
diese zu vergleichen:Der erste reguläre Ausdruck
(?=b)
stimmt überein und gibt als ersten Submatch "bar" zurück - entspricht dem 'b', verbraucht ihn jedoch nicht und belässt ihn in den folgenden Klammern.Der zweite reguläre Ausdruck stimmt NICHT überein, da erwartet wird, dass auf "foo" etwas anderes als "b" folgt.
(?:...)
hat genau den gleichen Effekt wie einfach(...)
, gibt diesen Teil jedoch nicht als Submatch zurück.quelle
Der einfachste Weg, Behauptungen zu verstehen, besteht darin, sie als den Befehl zu behandeln, der in einen regulären Ausdruck eingefügt wird. Wenn der Motor zu einer Zusicherung läuft, prüft er sofort den durch die Zusicherung beschriebenen Zustand. Wenn das Ergebnis wahr ist, fahren Sie mit dem regulären Ausdruck fort.
quelle
Das ist der wahre Unterschied:
Wenn Sie den Inhalt nach "?:" Oder "? =" Nicht interessieren, sind "?:" Und "? =" Genau gleich. Beide sind in Ordnung zu benutzen.
Wenn Sie diese Inhalte jedoch für den weiteren Prozess benötigen (nicht nur für das Ganze. In diesem Fall können Sie einfach "a (b)" verwenden), müssen Sie stattdessen "? =" Verwenden. Ursache "?:" Wird gerade durch weg.
quelle