Dieses Mal werde ich Ihnen die Verwendung von lastIndex in regulären Ausdrücken ausführlich erläutern. Was sind die Vorsichtsmaßnahmen bei der Verwendung von lastIndex in regulären Ausdrücken?
Schreiben Sie den folgenden Ausgabeinhalt nacheinander.
var reg1 = /a/; var reg2 = /a/g; console.log(reg1.test('abcabc')); // true console.log(reg1.test('abcabc')); // true console.log(reg1.test('abcabc')); // true console.log(reg1.test('abcabc')); // true console.log(reg2.test('abcabc')); // true console.log(reg2.test('abcabc')); // true console.log(reg2.test('abcabc')); // false console.log(reg2.test('abcabc')); // true
Ein sehr einfacher regulärer Ausdruck-Test, um herauszufinden, ob in der Zeichenfolge abcabc ein Zeichen a vorhanden ist. Aber das Ergebnis enthält eine besondere Falschheit: Warum?
lastIndex (für reguläre Ausdrücke mit Parameter g)
In jedem instanziierten RegExp-Objekt gibt es ein lastIndex-Attribut dessen Anfangswert 0 ist.
/a/.lastIndex // 0 new RegExp('a').lastIndex // 0 lastIndex表示匹配成功时候,匹配内容最后一个字符所在原字符串中的位置 + 1,也就是匹配内容的下一个字符的index(如果匹配内容在字符串的结尾,同样返回原字符串中的位置 + 1,也就是字符串的length)。如果未带参数g,lastIndex始终为0。 var reg = /ab/g; reg.test('123abc'); console.log(reg.lastIndex) // 5 // 匹配内容在最后 var reg = /ab/g; reg.test('123ab'); console.log(reg.lastIndex) // 5 // 不带参数g var reg = /ab/; reg.test('123abc'); console.log(reg.lastIndex) // 0
Und dieser letzte Index ist die Startposition des Abgleichs, wenn dieser reguläre Ausdruck für andere Abgleichsvorgänge verwendet wird. Wenn die Übereinstimmung fehlschlägt, wird lastIndex auf 0 zurückgesetzt.
var reg = /ab/g; // 初始值为0,从最开始匹配 匹配成功, lastIndex为4 console.log(reg.test('12ab34ab'), reg.lastIndex); // true 4 // 从第4位字符"3"开始匹配 匹配内容为第二个ab lastIndex 为 8 console.log(reg.test('12ab34ab'), reg.lastIndex); // true 8 // 从第8位 (字符长度为8,没有第8位) 开始匹配 匹配不成功 重置lastIndex 为 0 console.log(reg.test('12ab34ab'), reg.lastIndex); // false 0 // 从头匹配 同第一步 console.log(reg.test('12ab34ab'), reg.lastIndex); // true 4
Nachdem ich dies gesehen habe, wurde die Frage beantwortet und der nächste Schritt besteht darin, es zu erweitern.
Mit nicht erneut deklarierten Registrierungen kann man leicht Fehler machen.
// 测试字符串str1 和 str2 是否都含有ab字符 var reg = /ab/g; var str1 = '123ab'; var str2 = 'ab123'; console.log(reg.test(str1)); // true console.log(reg.test(str2)); // false
Offensichtlich liegt aufgrund von lastIndex ein Beurteilungsfehler vor. Hier können Sie reg ohne Parameter g ändern oder reg neu deklarieren. Natürlich können Sie reg.lastIndex = 0 nach dem ersten Treffer auch manuell ändern.
Vorabprüfung
Dann sprechen wir über die Vorabprüfung, was wörtlich bedeutet, die passende Abfrage vorzubereiten, also abzufragen Nächster Inhalt des übereinstimmenden Inhalts, aber nur Die vorbereitete Abfrage stimmt überein und gibt nicht zurück.
Oft müssen wir bestimmte Zeichen gefolgt von bestimmten Zeichen in einer Zeichenfolge zuordnen, aber wir müssen die folgenden Zeichen nicht in das Übereinstimmungsergebnis einbeziehen, zum Beispiel:
Finden Sie die folgende Zeichenfolge heraus Auf die Zeichen folgen alle Zeichen von 2.
var str = 'a1b2c22d31e4fg6h2'; 'a1b2c22d31e4fg6h2'.match(/[a-z]2/g); // ["b2", "c2", "h2"]
Obwohl die Zeichenfolge mit 2 abgeglichen werden kann, benötigen wir auf diese Weise nicht die Zahl 2, sondern nur die Zeichen. Anhand der Vorprüfung:
'a1b2c22d31e4fg6h2'.match(/[a-z](?=2)/g); // ["b", "c", "h"]
können Sie erkennen, dass die Bedingungen vollständig erfüllt sind, aber wie viel hat die Vorprüfung mit lastIndex, dem Thema dieses Artikels, zu tun?
Um zu sehen, warum test verwendet wird, müssen wir hier erklären, ob die Übereinstimmung fehlschlägt und der lastIndex auf 0 zurückgesetzt wird.
Exec und Test werden zurückgegeben, wenn die erste Übereinstimmung erfolgreich ist oder wenn die Übereinstimmung fehlschlägt, und es erfolgt keine weitere Übereinstimmung.
var reg1 = /[a-z](?=2)/g; var reg2 = /[a-z]2/g; var str = 'a1b2c22d31e4fg6h2'; console.log(reg1.test(str), reg1.lastIndex); // true 3 console.log(reg1.test(str), reg1.lastIndex); // true 5 console.log(reg1.test(str), reg1.lastIndex); // true 16 console.log(reg1.test(str), reg1.lastIndex); // false 0 console.log(reg2.test(str), reg2.lastIndex); // true 4 console.log(reg2.test(str), reg2.lastIndex); // true 6 console.log(reg2.test(str), reg2.lastIndex); // true 17 console.log(reg2.test(str), reg2.lastIndex); // false 0
Sehen Sie das Problem? Der vorab geprüfte lastIndex enthält nicht den vorab geprüften Inhalt! Dies kann zur Vereinfachung vieler Urteile genutzt werden.
Wenn wir beispielsweise das Passwort abgleichen möchten, muss es mindestens einen Großbuchstaben, einen Kleinbuchstaben und eine Zahl enthalten und mindestens 6 Zeichen lang sein und darf nur eine Kombination aus Zahlen und Buchstaben sein .
Je nach Situation ohne Vorabprüfung wird es wie folgt beurteilt:
/[a-z]/.test(pwd) && /[A-Z]/.test(pwd) && /\d/.test(pwd) && /^[a-zA-Z0-9]{6,}$/.test(pwd);
Aber:
/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z0-9]{6,}$/.test(pwd)
Aufschlüsselung:
(? =.*[a-z]) Ob es Kleinbuchstaben gibt, aber der Vorabgleich fehlschlägt und false zurückgegeben wird. Wenn der lastIndex erfolgreich ist, ändert er sich nicht und ist immer noch 0. Auf die gleiche Weise verstehen wir Der Vorabprüfungsinhalt der beiden externen Elemente ist am Ende eine Kombination aus Buchstaben und Zahlen über 6, aber die vorherigen sind alle Vorabprüfungen, lastIndex ist immer nicht 0 und jede Übereinstimmung wird von Anfang an abgeglichen. damit die Voraussetzungen erfüllt sind.
Ich glaube, dass Sie die Methode beherrschen, nachdem Sie den Fall in diesem Artikel gelesen haben. Weitere spannende Informationen finden Sie in anderen verwandten Artikeln auf der chinesischen PHP-Website!
Empfohlene Lektüre:
Basierend auf PHP reguläre Nullbreite Detaillierte Erläuterung der Verwendung von Behauptungen
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Verwendung von lastIndex in regulären Ausdrücken. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!