• javascript 正则中的一个易错点


    转自:http://www.laruence.com/2009/08/09/1036.html

     在下面例子中,同样的正则, 同样的字符串, 循环匹配结果却不一样 ,

    <script type='text/javascript'>
    var reTest = /^aid=(.*)/ig;
     
    var aData = [ 'aid=^$', 'aid=^$', 'aid=^$', 'aid=^$' ]; 
     
    for (var i=0, l=aData.length; i<l; i++) {
         alert(reTest.test(aData[i]));
    }
    </script>

    输出:

    true false true false;

    为什么会这样呢? 这个就和JS中正则对象的lastIndex属性有关了

    定义和用法

    lastIndex 属性用于规定下次匹配的起始位置。
    语法

    Js代码
    RegExpObject.lastIndex

    说明

    该属性存放一个整数,它声明的是上一次匹配文本之后的第一个字符的位置
    上次匹配的结果是由方法 RegExp.exec() 和 RegExp.test() 找到的,它们都以 lastIndex 属性所指的位置作为下次检索的起始点。这样,就可以通过反复调用这两个方法来遍历一个字符串中的所有匹配文本
    该属性是可读可写的。只要目标字符串的下一次搜索开始,就可以对它进行设置。当方法 exec() 或 test() 再也找不到可以匹配的文本时,它们会自动把 lastIndex 属性重置为 0。

    提示和注释

    重要事项:不具有标志 g 和不表示全局模式的 RegExp 对象不能使用 lastIndex 属性
    提示:如果在成功地匹配了某个字符串之后就开始检索另一个新的字符串,需要手动地把这个属性设置为 0

    So, 原因很明显, 解决方法也很明了了.

    <script type='text/javascript'>
    var reTest = /^aid=(.*)/ig;
     
    var aData = [ 'aid=^$', 'aid=^$', 'aid=^$', 'aid=^$' ]; 
     
    for (var i=0, l=aData.length; i<l; i++) {
            reTest.lastIndex = 0;
         alert(reTest.test(aData[i]));
    }
    </script>

     

    另外, moxie同学说的方法其实更有效, 既然你不需要g, 那何必设置g呢?

    <script type='text/javascript'>
    var reTest = /^aid=(.*)/i;
     
    var aData = [ 'aid=^$', 'aid=^$', 'aid=^$', 'aid=^$' ]; 
     
    for (var i=0, l=aData.length; i<l; i++) {
         alert(reTest.test(aData[i]));
    }
    </script>

    也可以正常工作。

     

  • 相关阅读:
    php 魔鬼训练
    php 验证码
    php 经典分页(推荐和laypage配合)
    php 过时的sql操作库(学习使用)
    php 上传图片
    npm 国内淘宝镜像cnpm、设置淘宝源
    gulp + webpack + sass 学习
    关于分页的解决方案收集
    SVN的学习和安装
    使用和学习 ES2015
  • 原文地址:https://www.cnblogs.com/youxin/p/2698381.html
Copyright © 2020-2023  润新知