亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么帶有全局標志的RegExp會產生錯誤的結果?

為什么帶有全局標志的RegExp會產生錯誤的結果?

為什么帶有全局標志的RegExp會產生錯誤的結果?當我使用全局標志和不區分大小寫的標志時,這個正則表達式有什么問題?查詢是用戶生成的輸入。結果應該是[true,true]。var query = 'Foo B';var re = new RegExp(query, 'gi');var result = [];result.push(re.test('Foo Bar'));result.push(re.test('Foo Bar'));// result will be [true, false]var reg = /^a$/g;for(i = 0; i++ < 10;)   console.log(reg.test("a"));
查看完整描述

3 回答

?
慕妹3242003

TA貢獻1824條經驗 獲得超6個贊

您正在使用單個RegExp對象并多次執行它。在每次連續執行時,它從最后一個匹配索引繼續。


您需要“重置”正則表達式,以便在每次執行之前從頭開始:


result.push(re.test('Foo Bar'));

re.lastIndex = 0;

result.push(re.test('Foo Bar'));

// result is now [true, true]

已經說過每次創建一個新的RegExp對象可能更具可讀性(無論如何,由于RegExp被緩存,開銷很?。?/p>


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

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


查看完整回答
反對 回復 2019-05-23
?
湖上湖

TA貢獻2003條經驗 獲得超2個贊

RegExp.prototype.test更新正則表達式的lastIndex屬性,以便每個測試將從最后一個測試停止的位置開始。我建議使用,String.prototype.match因為它不更新lastIndex屬性:

!!'Foo Bar'.match(re); // -> true!!'Foo Bar'.match(re); // -> true

注意:!!將其轉換為布爾值,然后反轉布爾值,以便反映結果。

或者,您可以重置該lastIndex屬性:

result.push(re.test('Foo Bar'));re.lastIndex = 0;result.push(re.test('Foo Bar'));


查看完整回答
反對 回復 2019-05-23
  • 3 回答
  • 0 關注
  • 725 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號