求出字符串中大写字母,小写字母和数字的个数

用正则表达遇到的问题:

empty
function statistic(str){
        var result = {"n1":0,"n2":0,"n3":0};//n1:大写个数,n2:小写个数,n3:数字个数
        var reg1 = /([A-Z])/g//判断大写的正则表达式
        var reg2 = /([a-z])/g//判断小写的正则表达式
        var reg3 = /([0-9])/g//判断数字的正则表达式
        for(var i in str){
            if(reg1.test(str[i])){
                result.n1++;
                reg1.lastIndex = 0;
                continue;
            }
            if(reg2.test(str[i])){
                result.n2++;
                reg2.lastIndex = 0;
                continue;
            }
            if(reg3.test(str[i])){
                result.n3++;
                reg3.lastIndex = 0;
            }
        }
        return result;
    }

       当这样用str[i].test(/([A-Z])/g)时,结果没做什么变化,查到资料正则表达式是要在.test前面test后面()里是该字符串, 所以定义了三个正则表达式分别判断大写,小写和数字,再把if里的条件都改为reg1.test(str[i])
      方法 RegExp.exec( ) 和 RegExp.test( ) 找到的,它们都以 lastIndex 属性所指的位置作为下次检索的起始点。 比如abc,从a开始判断,第二次就从b开始判断,之前的a就不再进行判断,后来查了有两种解决方案:
      ① reg1.lastIndex = 0;方法 exec() 或 test() 再也找不到可以匹配的文本时,它们会自动把 lastIndex 属性重置为 0。
      ②直接去掉 g 标签

lastIndex属性必须配合g使用,不然就不要用g字母,小写字母和数字的个数。

lastIndex属性是可读可写的。只要目标字符串的下一次搜索开始,就可以对它进行设置。当方法 exec() 或 test() 再也找不到可以匹配的文本时,它们会自动把 lastIndex 属性重置为 0。

重要事项:不具有标志 g 和不表示全局模式的 RegExp 对象不能使用 lastIndex 属性。

提示:如果在成功地匹配了某个字符串之后就开始检索另一个新的字符串,需要手动地把这个属性设置为 0。


你可能感兴趣的:(JS)