Das ist sehr nützlich – zumindest denke ich das. Manchmal möchten Sie Ihre Übereinstimmungen einfach nicht mit unnötigen Werten überladen.
Ich habe versucht, die Dokumentation und den offiziellen Namen dafür nachzuschlagen (ich nenne es eine nicht einfangende Gruppe, aber ich glaube, ich habe es schon einmal gehört).
Da es sich um Symbole handelte, schien es Google schwierig zu sein.
Ich habe mir auch eine Reihe von Regex-Referenzhandbüchern angesehen, ohne Erwähnung.
Präfix mit ?und das Erscheinen in den ersten Zeichen in Klammern lässt mich glauben, dass es etwas mit Lookaheads oder Lookbehinds zu tun hat.
Also, wie ist der richtige Name dafür, und wo kann ich mehr erfahren?
+1, weil ich es nicht wusste ?: (obwohl es RegEx noch unlesbarer macht)
– DrColossos
28. September 2010 um 12:40 Uhr
Gute Arbeit Jungs, jeder bekommt einen Punkt von mir
– Benutzer187291
28. September 2010 um 12:42 Uhr
ircmaxell
Es ist verfügbar auf der Teilmuster Seite der offiziellen Dokumentation.
Die Tatsache, dass einfache Klammern zwei Funktionen erfüllen, ist nicht immer hilfreich. Es gibt oft Zeiten, in denen ein Gruppierungsteilmuster ohne Erfassungsanforderung erforderlich ist. Wenn auf eine öffnende Klammer ein “?:” folgt, führt das Untermuster keine Erfassung durch und wird nicht gezählt, wenn die Anzahl aller nachfolgenden Erfassungs-Untermuster berechnet wird. Wenn beispielsweise die Zeichenfolge „die weiße Dame“ mit dem Muster „(?:rot|weiß) (König|Königin)“ abgeglichen wird, sind die erfassten Teilzeichenfolgen „weiße Dame“ und „Königin“ und mit 1 und 2 nummeriert Die maximale Anzahl erfasster Teilzeichenfolgen beträgt 99, und die maximale Anzahl aller Teilmuster, sowohl erfassende als auch nicht erfassende, beträgt 200.
Es ist auch gut zu beachten, dass Sie damit Optionen für das Untermuster festlegen können. Wenn Sie beispielsweise möchten, dass nur das Teilmuster die Groß-/Kleinschreibung nicht beachtet, können Sie Folgendes tun:
(?i:foo)bar
Wird passen:
foobar
Foobar
FoObar
…etc
Aber nicht
fooBar
FooBAR
…etc
Oh, und obwohl die offizielle Dokumentation die Syntax nicht explizit benennt, bezeichnet sie sie später als “nicht erfassendes Teilmuster” (was absolut Sinn macht und ich es trotzdem nennen würde, da es nicht wirklich so ist eine “Gruppe”, sondern ein Untermuster) …
Diese Antwort wurde den häufig gestellten Fragen zu regulären Ausdrücken zu Stapelüberläufen unter “Gruppen” hinzugefügt.
– aliteralmind
10. April 2014 um 0:25 Uhr
(?:) als Ganzes repräsentiert a nicht einfangende Gruppe.
Das Fragezeichen und der Doppelpunkt nach der öffnenden runden Klammer sind die spezielle Syntax, mit der Sie der Regex-Engine mitteilen können, dass dieses Klammerpaar keine Rückwärtsreferenz erzeugen soll. Beachten Sie das Fragezeichen […] ist der Regex-Operator, der das vorherige Token optional macht. Dieser Operator kann nicht nach einer öffnenden runden Klammer erscheinen, da eine öffnende Klammer an sich kein gültiges Regex-Token ist. Daher gibt es keine Verwechslung zwischen dem Fragezeichen als Operator, um ein Token optional zu machen, und dem Fragezeichen als Zeichen, um die Eigenschaften eines Paars runder Klammern zu ändern. Der Doppelpunkt zeigt an, dass die Änderung, die wir vornehmen möchten, darin besteht, die Erfassung der Rückwärtsreferenz auszuschalten.
Hier ist, was ich gefunden habe:
Wenn Sie die Rückwärtsreferenz nicht verwenden, können Sie diesen regulären Ausdruck in Set(?:Value)? optimieren. Das Fragezeichen und der Doppelpunkt nach der öffnenden runden Klammer sind die spezielle Syntax, mit der Sie der Regex-Engine mitteilen können, dass dieses Klammerpaar keine Rückwärtsreferenz erzeugen soll. Beachten Sie, dass das Fragezeichen nach der öffnenden Klammer nichts mit dem Fragezeichen am Ende der Regex zu tun hat. Dieses Fragezeichen ist der Regex-Operator, der das vorherige Token optional macht. Dieser Operator kann nicht nach einer öffnenden runden Klammer erscheinen, da eine öffnende Klammer an sich kein gültiges Regex-Token ist. Daher gibt es keine Verwechslung zwischen dem Fragezeichen als Operator, um ein Token optional zu machen, und dem Fragezeichen als Zeichen, um die Eigenschaften eines Paars runder Klammern zu ändern. Der Doppelpunkt zeigt an, dass die Änderung, die wir vornehmen möchten, darin besteht, die Erfassung der Rückwärtsreferenz auszuschalten.
Es steht im PHP-Handbuch, und ich glaube, jeder andere Abschnitt mit nahezu vollständigen regulären Ausdrücken für jede Sprache …
Die Tatsache, dass einfache Klammern zwei Funktionen erfüllen, ist nicht immer hilfreich. Es gibt oft Zeiten, in denen ein Gruppierungsteilmuster ohne Erfassungsanforderung erforderlich ist. Wenn auf eine öffnende Klammer ein “?:” folgt, führt das Untermuster keine Erfassung durch und wird nicht gezählt, wenn die Anzahl aller nachfolgenden Erfassungs-Untermuster berechnet wird.
PHPs preg_match_all nutzt die PCRE (Perl-Compatible Regular Expression)-Syntax, die dokumentiert ist hier. Nicht erfassende Teilmuster sind in dokumentiert Kapitel Untermuster.
würde mich glauben lassen, dass es etwas mit Lookaheads oder Lookbehinds zu tun hat.
Nein, es gibt viele verschiedene Funktionen, die durch Open-Bracket-Fragezeichen ausgelöst werden. Lookahead/Lookbehind ist nur der erste, den Sie getroffen haben.
Es ist chaotisch, dass viele Optionen hineingequetscht werden müssen (?anstatt eine eigene besser lesbare Syntax zu erhalten, aber es war notwendig, alles in eine Sequenz einzufügen, was zuvor kein gültiger Ausdruck an sich war, in älteren Varianten von Regex.
Alex Pliutau
Ich weiß nicht, wie das mit ?: geht, aber es ist einfach mit einer einfachen Schleife:
+1, weil ich es nicht wusste
?:
(obwohl es RegEx noch unlesbarer macht)– DrColossos
28. September 2010 um 12:40 Uhr
Gute Arbeit Jungs, jeder bekommt einen Punkt von mir
– Benutzer187291
28. September 2010 um 12:42 Uhr