js正则匹配中文

// 用正则匹配中文

var arr2 = ["匹","配","中","文"];
var pattern1 = /[\u4e00-\u9fa5]+/g;
for (var i = 0; i < arr2.length; i++) {
    if (pattern1.test(arr2[i])) {
        console.log(arr2[i]);    // 匹,中
    }
}

上面的代码为何只输出了 匹、中?

阅读 9.8k
3 个回答

全局匹配影响的
lastIndex:下一个匹配的索引值。(这个属性只有在使用g参数时可用)
在全局匹配下,匹配成功后正则表达式的lastIndex会增加,若开始为0,如果上一次匹配成功了。lastIndex就会变为1,而进行一下个字母比较就是从位置1开始比较的,你第二个为,只有一个,lastIndex为0的话可以匹配,但是为1,找后面的字符串找不到,所以匹配失败,失败后lastIndex变为0,下次从0开始搜索,匹配成功....

 var arr2 = ["匹","配","中","文"];
var pattern1 = /[\u4e00-\u9fa5]+/g;
for (var i = 0; i < arr2.length; i++) { 
    console.log(pattern1.lastIndex) //0 1 0 1
    if (pattern1.test(arr2[i])) {
        console.log(arr2[i]);    // 匹,中
    }
}

由上可知,若想显示,lastIndex是逐渐增加的,类似于下面的才能显示出来

 var arr2 = ["匹","配配","中中中","文文文文"];

所以应该去掉/g,或者循环时将lastIndex重置为0

var pattern1 = /[\u4e00-\u9fa5]+/g;
for (var i = 0; i < arr2.length; i++) { 
    pattern1.lastIndex=0; 
    if (pattern1.test(arr2[i])) {
        console.log(arr2[i]);    
    }
}

正则最后的g去掉

<script type="text/javascript">
    var arr2 = ["匹","配","中","文"];
    var pattern1 = /[\u4e00-\u9fa5]+/;
    for (var i = 0; i < arr2.length; i++) {
        if (pattern1.test(arr2[i])) {
            console.log(arr2[i]);    // 匹,中
        }
    }
</script>

嗯,匹配的不是“匹”和“中”,它匹配的是偶数索引,,原因不明,,,
然后听楼上的,干掉g确实可以
图片描述

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏