Maison  >  Questions et réponses  >  le corps du texte

Pourquoi les expressions régulières pour les indicateurs globaux entraînent-elles un résultat incorrect ?

<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粉282627613P粉282627613445 Il y a quelques jours503

répondre à tous(2)je répondrai

  • P粉399090746

    P粉3990907462023-08-23 00:35:02

    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));

    répondre
    0
  • P粉523335026

    P粉5233350262023-08-23 00:21:13

    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);

    répondre
    0
  • Annulerrépondre