搜尋

首頁  >  問答  >  主體

全域標誌的正規表示式為何會導致錯誤的輸出?

<p>當我使用全域標誌和不區分大小寫標誌時,這個正規表示式有什麼問題?查詢是使用者產生的輸入。結果應該是[true, true]。 </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')); // 結果將會是[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粉282627613463 天前514

全部回覆(2)我來回復

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

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

    回覆
    0
  • 取消回覆