javascript - l'expression régulière js sera bizarre si vous utilisez ^ et $ puis utilisez g, mais aucune erreur ne sera signalée
伊谢尔伦
伊谢尔伦 2017-05-19 10:40:32
0
2
516
var reg1 =  /^1$/g;
var reg2 = /^1$/;
for (var i = 0; i < 10; i++) {
    console.log(reg1.test('1')) // true false true false true false true false ...
    console.log(/^1$/g.test('1')) // true  true  true  true  true  true  true ...
    console.log(reg2.test('1')) // true  true  true  true  true  true  true ...
    console.log(/^1$/.test('1')) // true  true  true  true  true  true  true ...
}

Pourquoi la sortie du premier console.log est-elle comme ça ?

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

répondre à tous(2)
世界只因有你

Lorsque l'expression régulière est exécutée, le lastIndex de l'objet RegExp peut changer.

La méthode

test est utilisée pour détecter si une chaîne correspond à une certaine règle régulière. Tant que la chaîne contient du texte qui correspond à la règle régulière, la méthode renvoie vrai, sinon elle renvoie faux.

En fait, si l'expression régulière a un flag global (avec le paramètre g), la méthode de test est également affectée par l'attribut lastIndex de l'objet régulier, comme suit :

var reg = /[a-z]+/;//正则不带全局标志
console.log(reg.test("abc"));//true
console.log(reg.test("de"));//true

var reg = /[a-z]+/g;//正则带有全局标志g
console.log(reg.test("abc"));//true
console.log(reg.lastIndex);//3, 下次运行test时,将从索引为3的位置开始查找
console.log(reg.test("de"));//false

Cet impact sera analysé dans l'explication de la méthode exec.

La méthode

exec est utilisée pour détecter la correspondance d'une chaîne par rapport à une expression régulière si un texte correspondant est trouvé, elle renvoie un tableau de résultats, sinon elle renvoie null.

Syntaxe : exec(string)

Le tableau renvoyé par la méthode

exec contient deux attributs supplémentaires, index et input. Et le tableau a les caractéristiques suivantes :

.
  • Le 0ème élément représente le texte capturé par l'expression régulière

  • Le 1er~n élément représente la 1~nième référence arrière, qui à son tour pointe vers le texte capturé dans le 1~nième groupe. Vous pouvez utiliser RegExp.$ + "Number 1~n" pour obtenir le texte dans le groupe. dans l'ordre

  • index représente la position initiale de la chaîne correspondante

  • input représente la chaîne en cours de récupération

Que l'expression régulière ait ou non le drapeau global "g", le comportement de exec est le même. Mais le comportement de l'objet d'expression régulière est quelque peu différent. Expliquons en détail comment est le comportement de l'objet d'expression régulière. différent.

Supposons que l'objet d'expression régulière est reg, que le caractère détecté est une chaîne et que la valeur de retour de reg.exec(string) est un tableau.

Si reg contient la marque globale "g", alors l'attribut reg.lastIndex représente la position après la fin de la chaîne correspondante dans la chaîne d'origine, c'est-à-dire la position où commence la prochaine correspondance à ce moment, reg.lastIndex. == array.index (correspond à la position de départ) + array[0].length (correspondant à la longueur de la chaîne comme suit :

).
var reg = /([a-z]+)/gi,
    string = "World Internet Conference";
var array = reg.exec(string);
console.log(array);//["World", "World", index: 0, input: "World Internet Conference"]
console.log(RegExp.);//World
console.log(reg.lastIndex);//5, 刚好等于 array.index + array[0].length

Au fur et à mesure de la récupération, la valeur de array.index sera incrémentée, c'est-à-dire que la valeur de reg.lastIndex sera également incrémentée de manière synchrone. Par conséquent, nous pouvons également parcourir toutes les correspondances de la chaîne en appelant à plusieurs reprises la méthode exec. Texte. Jusqu'à ce que la méthode exec ne corresponde plus au texte, elle renverra null et réinitialisera la propriété reg.lastIndex à 0.

En suivant l'exemple ci-dessus, nous continuons à exécuter le code pour voir si ce qui précède est correct, comme indiqué ci-dessous :

array = reg.exec(string);
console.log(array);//["Internet", "Internet", index: 6, input: "World Internet Conference"]
console.log(reg.lastIndex);//14

array = reg.exec(string);
console.log(array);//["Conference", "Conference", index: 15, input: "World Internet Conference"]
console.log(reg.lastIndex);//25

array = reg.exec(string);
console.log(array);//null
console.log(reg.lastIndex);//0

Dans le code ci-dessus, comme la méthode exec est appelée à plusieurs reprises, la propriété reg.lastIndex est finalement réinitialisée à 0.

Examen des problèmes

Dans l'explication de la méthode de test, nous avons laissé un problème. Si l'expression régulière a le drapeau global g, le résultat de l'exécution de la méthode de test ci-dessus sera affecté par reg.lastIndex. De plus, la méthode exec est également la méthode de test. idem. Depuis reg.lastIndex La valeur n'est pas toujours nulle et elle détermine la position de départ de la prochaine correspondance. Si vous souhaitez commencer à récupérer une nouvelle chaîne après avoir terminé une correspondance dans une chaîne, vous devez réinitialiser manuellement l'attribut lastIndex. 0. Évitez les erreurs suivantes :

var reg = /[0-9]+/g,
    str1 = "123abc",
    str2 = "123456";
reg.exec(str1);
console.log(reg.lastIndex);//3
var array = reg.exec(str2);
console.log(array);//["456", index: 3, input: "123456"]

Le résultat d'exécution correct du code ci-dessus doit être "123456", il est donc recommandé d'ajouter "reg.lastIndex = 0;" avant d'exécuter la méthode exec pour la deuxième fois.

Si reg ne contient pas l'indicateur global "g", alors le résultat de l'exécution (tableau) de la méthode exec sera exactement le même que le résultat de l'exécution de la méthode string.match(reg).

Cet extrait provient du manuel d'utilisation du Front-End d'expression régulière | blog Louis. S'il vous a été utile, veuillez lui donner un like~

.
巴扎黑

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal