Heim  >  Artikel  >  Web-Frontend  >  Detaillierte Erläuterung der Gruppierung in regulären Javascript-Ausdrücken

Detaillierte Erläuterung der Gruppierung in regulären Javascript-Ausdrücken

高洛峰
高洛峰Original
2017-01-20 13:47:051477Durchsuche

Ich habe zuvor einen Artikel über den Einstieg in reguläre Ausdrücke geschrieben, aber heute bin ich auf eine weitere Gefahr gestoßen. Heute werde ich mich auf das Teilen konzentrieren Javascript mit Ihnen. Gruppierung in regulären Ausdrücken. Wenn Sie die regulären JS-Ausdrücke nicht ausreichend verstehen, können Sie hier klicken, um mehr zu erfahren.

Gruppierung wird häufig in regulären Ausdrücken verwendet. Die Gruppierung ist ein Klammerpaar (). Jedes Klammerpaar stellt eine Gruppierung dar.

Erfassende Gruppierung

Nicht erfassende Gruppierung

Erfassende Gruppierung

Erfassende Gruppierung wird in Dingen wie Match Exec verwendet. In der Funktion wird die entsprechende Gruppierung verwendet Die Ergebnisse werden in Form des zweiten Items und des dritten Items erhalten. Schauen wir uns zunächst ein Beispiel an

var reg = /test(\d+)/;
 var str = 'new test001 test002';
 console.log(str.match(reg));
//["test001", "001", index: 4, input: "new test001 test002"]
(d+) im Code ist eine Gruppe (manche Leute nennen es auch ein Untermuster), aber alles bedeutet die gleiche Bedeutung, Im obigen Beispiel ist test001 das genaue Übereinstimmungsergebnis

. Beim gruppierten Abgleich werden jedoch die Zeichen gefunden, die mit dem Untermuster d+ aus dem gesamten genauen Übereinstimmungsergebnis (d. h. test001) übereinstimmen, was offensichtlich 001 ist .

Aber die Situation, auf die ich heute gestoßen bin, ist wie folgt

var reg = /test(\d)+/;
 var str = 'new test001 test002';
 console.log(str.match(reg));
//["test001", "1", index: 4, input: "new test001 test002"]
Der Unterschied besteht darin, dass (d+) in (d)+ geändert wird, das gesamte Übereinstimmungsergebnis ist immer noch test001, aber das Ergebnis der ersten Gruppe ist anders.

Lassen Sie uns ihre Unterschiede langsam analysieren

(d+) Dies ist eine Gruppierungssituation, da der Matching-Modus standardmäßig der Greedy-Modus ist, was bedeutet, dass so viele wie möglich übereinstimmen

alle d+, das übereinstimmende Ergebnis ist 001. Dann wird außen ein Klammerpaar hinzugefügt, das eine Gruppe darstellt, sodass das übereinstimmende Ergebnis in der ersten Gruppe 001 ist.

Schauen wir uns das zweite Beispiel (d)+ an in ist auch ein gieriges Muster. Es wird zuerst mit 0 übereinstimmen, dann mit 1 und am Ende mit 1. Es wird auch bis zum Ende des Spiels übereinstimmen. In diesem Beispiel gibt es keinen Unterschied in der Übereinstimmung, aber die Gruppierung (d) bedeutet hier eine Übereinstimmung mit einer einzelnen Zahl

Nach meinem bisherigen Verständnis entspricht sie dem ersten übereinstimmenden Ergebnis, das 0 ist . Aber dieses Verständnis ist falsch. Da es sich beim gesamten Matching um einen gierigen Modus handelt, wird durch das Abgleichen möglichst vieler (d) in der Gruppe

das letzte übereinstimmende Ergebnis 1

erfasst, wenn es sich um einen nicht gierigen Modus handelt Modus, dann wird versucht,


so wenig wie möglich abzugleichen. Auf diese Weise ist das Übereinstimmungsergebnis von (d) 0. Obwohl es später noch Übereinstimmungsergebnisse gibt sind so wenige wie möglich. Übereinstimmung

Nicht erfassende Gruppierung
var reg = /test(\d)+?/;
 var str = 'new test001 test002';
 console.log(str.match(reg));
 
//["test001", "0", index: 4, input: "new test001 test002"]

Nicht erfassende Gruppierung bedeutet, dass an einigen Stellen ein Paar Klammern erforderlich ist, aber Sie Ich möchte nicht, dass es zu einer Capture-Gruppe wird. Gruppierung bedeutet, dass diese Gruppe nicht von Funktionen wie macth exec übernommen werden soll.

Fügen Sie normalerweise ?: vor den Klammern hinzu, d. h. (?:pattern ), was zu einer nicht erfassenden Gruppierung wird.
var reg = /test(?:\d)+/;
 var str = 'new test001 test002';
 console.log(str.match(reg));
//["test001", index: 4, input: "new test001 test002"]

Auf diese Weise wird der gruppierte übereinstimmende Inhalt nicht im Übereinstimmungsergebnis angezeigt, d. h. das zweite Element 1 fehlt

Dieser Artikel konzentriert sich auf (d+) und (d) Der Unterschied zwischen + ist auch die Falle, in die ich heute geraten bin. Wenn es Fehler gibt, korrigieren Sie mich bitte.

Ausführlichere Erläuterungen zur Gruppierung in regulären Javascript-Ausdrücken und verwandte Artikel finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn