Heim  >  Fragen und Antworten  >  Hauptteil

Warum verursachen reguläre Ausdrücke für globale Flags eine falsche Ausgabe?

<p>Was ist an dieser Regex falsch, wenn ich globale Flags und Flags ohne Berücksichtigung der Groß- und Kleinschreibung verwende? Abfragen sind benutzergenerierte Eingaben. Das Ergebnis sollte [wahr, wahr] sein. </p> <pre class="brush:php;toolbar:false;">var query = 'Foo B'; var re = new RegExp(query, 'gi'); var result = []; result.push(re.test('Foo Bar')); result.push(re.test('Foo Bar')); //Das Ergebnis ist [true, false]</pre> <hr> <p> <pre class="snippet-code-js lang-js Prettyprint-override"><code>var reg = /^a$/g; for(i = 0; i++ < 10;) console.log(reg.test("a"));</code></pre> </p>
P粉282627613P粉282627613425 Tage vor489

Antworte allen(2)Ich werde antworten

  • P粉399090746

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

    您正在使用一个RegExp对象,并且多次执行它。在每次执行时,它都会从上次匹配的索引继续。

    在每次执行之前,您需要“重置”正则表达式以从头开始:

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

    话虽如此,每次创建一个新的RegExp对象可能更易读(开销很小,因为RegExp已经被缓存):

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

    Antwort
    0
  • P粉523335026

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

    使用带有 g 标志的 RegExp 对象会跟踪匹配发生的 lastIndex,因此在后续的匹配中,它将从上次使用的索引开始,而不是从 0 开始。看一下示例:

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

    Antwort
    0
  • StornierenAntwort