Pourquoi les expressions régulières pour les indicateurs globaux entraînent-elles un résultat incorrect ?
P粉282627613
P粉282627613 2023-08-22 19:11:39
0
2
524
<p>Qu'est-ce qui ne va pas avec cette expression régulière lorsque j'utilise des indicateurs globaux et des indicateurs insensibles à la casse ? Les requêtes sont des entrées générées par l'utilisateur. Le résultat devrait être [vrai, vrai]. </p> <pre class="brush:php;toolbar:false;">var query = 'Foo B'; var re = new RegExp(query, 'gi'); var résultat = []; result.push(re.test('Foo Bar')); result.push(re.test('Foo Bar')); //Le résultat sera [true, false]</pre> <hr> <p> <pre class="snippet-code-js lang-js Prettyprint-override"><code>var reg = /^a$/g; pour(i = 0; i++ < 10;) console.log(reg.test("a"));</code></pre> </p>
P粉282627613
P粉282627613

répondre à tous(2)
P粉399090746

Vous utilisez un objet RegExp et vous l'exécutez plusieurs fois. A chaque exécution, il continue à partir du dernier index correspondant.

Avant chaque exécution, vous devez "réinitialiser" la regex pour repartir de zéro :

result.push(re.test('Foo Bar'));
re.lastIndex = 0;
result.push(re.test('Foo Bar'));
// 现在的结果是 [true, true]

Cela étant dit, il pourrait être plus lisible de créer un nouvel objet RegExp à chaque fois (peu de surcharge puisque le RegExp est déjà mis en cache) :

result.push((/Foo B/gi).test(stringA));
result.push((/Foo B/gi).test(stringB));
P粉523335026

Utilisé avec g 标志的 RegExp 对象会跟踪匹配发生的 lastIndex donc lors des matchs suivants, il commencera à partir du dernier index utilisé plutôt que de partir de 0. Jetez un œil à un exemple :

var query = 'Foo B';
var re = new RegExp(query, 'gi');
console.log(re.lastIndex);

console.log(re.test('Foo Bar'));
console.log(re.lastIndex);

console.log(re.test('Foo Bar'));
console.log(re.lastIndex);
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal