Maison  >  Article  >  interface Web  >  Explication détaillée de l'utilisation de lastIndex dans les expressions régulières

Explication détaillée de l'utilisation de lastIndex dans les expressions régulières

php中世界最好的语言
php中世界最好的语言original
2018-03-29 16:20:122070parcourir

Cette fois, je vais vous apporter une explication détaillée de l'utilisation de lastIndex dans les expressions régulières. Quelles sont les précautions lors de l'utilisation de lastIndex dans les expressions régulières. Voici des cas pratiques, jetons un coup d'œil.

Écrivez le contenu de sortie suivant dans l'ordre.

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

Un test d'expression régulière très simple pour savoir s'il y a un caractère a dans la chaîne abcabc. Mais il y a un faux particulier dans le résultat, pourquoi ?

lastIndex (pour les expressions régulières avec paramètre g)

dans chaque objet RegExp instancié, il y a un attribut lastIndex dont la valeur initiale est 0.

/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

Et ce lastIndex est la position de départ de la correspondance lors de l'utilisation de cette expression régulière pour d'autres opérations de correspondance. Lorsque la correspondance échoue, lastIndex est réinitialisé à 0.

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

Voyant cela, la question a reçu une réponse et la prochaine étape consiste à élargir.

Il est facile de faire des erreurs avec des réglementations non redéclarées.

// 测试字符串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

Il y a évidemment une erreur de jugement due à lastIndex. Ici, vous pouvez modifier reg sans paramètre g ou re-déclarer reg. Bien sûr, vous pouvez également modifier manuellement reg.lastIndex = 0 après la première correspondance.

Pré-vérification

Parlons ensuite de pré-vérification, qui signifie littéralement préparer la requête correspondante, c'est-à-dire interroger le contenu suivant du contenu correspondant, mais uniquement La requête préparée correspond et ne renvoie pas.

Souvent, nous devons faire correspondre certains caractères suivis de certains caractères dans une chaîne, mais nous n'avons pas besoin d'inclure les caractères suivants dans le résultat de la correspondance, par exemple :

Découvrez la chaîne suivante Les caractères sont suivis de tous les caractères de 2.

var str = 'a1b2c22d31e4fg6h2';
'a1b2c22d31e4fg6h2'.match(/[a-z]2/g); // ["b2", "c2", "h2"]

De cette façon, bien que la chaîne avec 2 puisse correspondre, nous n'avons pas besoin du chiffre 2, seuls les caractères sont nécessaires ici. En utilisant la pré-vérification :

'a1b2c22d31e4fg6h2'.match(/[a-z](?=2)/g); // ["b", "c", "h"]

vous pouvez voir que les conditions sont entièrement remplies, mais dans quelle mesure la pré-vérification a-t-elle à voir avec lastIndex, le sujet de cet article ?

Utilisons test pour voir. Quant à la raison pour laquelle test est utilisé, nous devons expliquer ici que la correspondance correspond à tout jusqu'à ce que la correspondance échoue, le lastIndex est réinitialisé à 0. .

L'exécutable et le test seront renvoyés si le premier match est réussi ou si le match échoue, et ne continueront pas à correspondre.

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

Vous voyez le problème ? Le lastIndex pré-vérifié ne contient pas le contenu pré-vérifié ! Cela peut être utilisé pour simplifier de nombreux jugements.

Par exemple, si nous voulons faire correspondre le mot de passe, il doit contenir au moins une lettre majuscule, une lettre minuscule, un chiffre et comporter au moins 6 caractères et ne peut être qu'une combinaison de chiffres et de lettres. .

Selon la situation sans pré-vérification, il sera jugé ainsi :

/[a-z]/.test(pwd) && /[A-Z]/.test(pwd) && /\d/.test(pwd) && /^[a-zA-Z0-9]{6,}$/.test(pwd);

Mais :

/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z0-9]{6,}$/.test(pwd)

Décomposition :

(? =.*[a-z]) S'il y a des lettres minuscules mais que la correspondance de pré-vérification échoue et que false est renvoyé Si le lastIndex réussit, il ne change pas et est toujours 0. De la même manière, nous comprenons. le contenu de pré-vérification des deux externes. En fin de compte, c'est une combinaison de lettres et de chiffres au-dessus de 6, mais les précédents sont tous des pré-vérifications, lastIndex n'est toujours pas 0 et chaque correspondance correspond au début, donc les exigences sont remplies.

Je pense que vous maîtrisez la méthode après avoir lu le cas dans cet article. Pour des informations plus intéressantes, veuillez prêter attention aux autres articles connexes sur le site Web chinois de php !

Lecture recommandée :

Explication graphique détaillée de l'utilisation du mode multiligne normal et du mode monoligne

Basé sur PHP régulier zéro largeur Explication détaillée de l'utilisation des assertions

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn