鍍金池/ 問(wèn)答/HTML/ 兩個(gè)相同數(shù)組元素,使用同一個(gè)正則驗(yàn)證,但驗(yàn)證結(jié)果不同?求教各位前輩指導(dǎo)問(wèn)題原因!

兩個(gè)相同數(shù)組元素,使用同一個(gè)正則驗(yàn)證,但驗(yàn)證結(jié)果不同?求教各位前輩指導(dǎo)問(wèn)題原因?。?!

一個(gè)數(shù)組內(nèi)有幾個(gè)重復(fù)元素,使用相同的正則去test();相同元素返回的結(jié)果一個(gè)是true一個(gè)卻是false。
請(qǐng)教各位前輩該問(wèn)題原因出在哪里?

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>index測(cè)試</title>
</head>
<body>
<script>
    window.onload = function () {
        var test1_reg = /(\[(NO)|(OK)+|\[[\u4e00-\u9fa5]{1,3}\])/g;
        var new_arry2 = ['[微123笑]123', '[色]', '[123流淚][呲123牙]', '[色]', '[色]', 123, '[色]', '[色]', '[色]', '[色]'];
        document.write(new_arry2 + '<br/>' + '<br/>');
        document.write(test1_reg.test(new_arry2[0]) + '===' + new_arry2[0] + '<br/>');
        document.write(test1_reg.test(new_arry2[1]) + '===' + new_arry2[1] + '<br/>');
        document.write(test1_reg.test(new_arry2[2]) + '===' + new_arry2[2] + '<br/>');
        document.write(test1_reg.test(new_arry2[3]) + '===' + new_arry2[3] + '<br/>');
        document.write(test1_reg.test(new_arry2[4]) + '===' + new_arry2[4] + '<br/>');
        document.write(test1_reg.test(new_arry2[5]) + '===' + new_arry2[5] + '<br/>');
        document.write(test1_reg.test(new_arry2[6]) + '===' + new_arry2[6] + '<br/>');
        document.write(test1_reg.test(new_arry2[8]) + '===' + new_arry2[8] + '<br/>');
        document.write(test1_reg.test(new_arry2[9]) + '===' + new_arry2[9] + '<br/>');
    };
</script>
</body>
</html>
回答
編輯回答
糖豆豆

如果正則表達(dá)式設(shè)置了全局標(biāo)志,test() 的執(zhí)行會(huì)改變正則表達(dá)式 lastIndex屬性。連續(xù)的執(zhí)行test()方法,后續(xù)的執(zhí)行將會(huì)從 lastIndex 處開(kāi)始匹配字符串.

var regex = /foo/g;

// regex.lastIndex is at 0
regex.test('foo'); // true

// regex.lastIndex is now at 3
regex.test('foo'); // false
2017年2月20日 02:27
編輯回答
司令

簡(jiǎn)化一下:

    window.onload = function () {
        var test1_reg = /(\[(NO)|(OK)+|\[[\u4e00-\u9fa5]{1,3}\])/g;
        var new_arry2 = ['[色]', '[色]','[色]'];
        document.write(new_arry2 + '<br/>' + '<br/>');
        document.write(test1_reg.lastIndex+ '<br/>');
        document.write(test1_reg.test(new_arry2[0]) + '===' + new_arry2[0] + '<br/>');
        document.write(test1_reg.lastIndex+ '<br/>');
        document.write(test1_reg.test(new_arry2[1]) + '===' + new_arry2[1] + '<br/>');
        document.write(test1_reg.lastIndex+ '<br/>');
        document.write(test1_reg.test(new_arry2[2]) + '===' + new_arry2[2] + '<br/>');
        document.write(test1_reg.lastIndex+ '<br/>');
    };

在我們定義的正則表達(dá)式中后面加上了搜索的方式,g表示全文查找。在正則表達(dá)式內(nèi)部有一個(gè)lastIndex來(lái)記錄匹配的位置,第一次調(diào)用test()并且匹配成功后,那么lastIndex就不再等于0,而是3,當(dāng)下次在調(diào)用該方法的時(shí)候,字符串的匹配會(huì)從lastIndex位置進(jìn)行匹配,所以第二次返回false。第二次匹配完之后發(fā)現(xiàn),lastIndex已經(jīng)到字符串的最后,所以,會(huì)自動(dòng)又跳到0。所以第三次有返回ture。

clipboard.png

解決方案:
1.去除g;
2.在第二次使用前,設(shè)置test1_reg.lastIndex=0即可。

2018年9月13日 17:06