今天在做正则循环匹配,碰到一个怪问题,第一次可以匹配上,但循环第一次之后,就无法匹配上了。猛然想起,RegExp中lastIndex属性,于是上网搜索了一下,将一些资料整理归纳,以备今后自己查阅(记性不好)

借鉴网上一个例子:http://www.dewen.org/q/468

<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>

因为使用了全局匹配标记g,正则表达式会记录匹配成功的位置lastIndex,继续匹配时就从该位置往后匹配。
因此可以修改正则,去除g标志

var reTest = /^aid=(.*)/i;//去除g

也可以在循环匹配是设置lastIndex:

for (var i=0, l=aData.length; i<l; i++) {
reTest.lastIndex = 0;//设置匹配位置
alert(reTest.test(aData[i]));
}

RegExp对象 是保存有关正则表达式模式匹配信息的固有全局对象。 不要将全局RegExp对象与 正则表达式对象混淆。尽管听起来像是一回事,但它们是截然不同的。全局RegExp对象的属性包含不断更新的关于每个匹配出现的信息,而正则表达式对象只包含出现正则表达式匹配的信息。

这个问题与js正则表达式的问题?类似,里面详细解释了原因

--------------------------- 下面是对于lastIndex 的解释 -----------------------------------------

每个RegExp对象的实例具有lastIndex属性,它是被查找字符串中下一次成功匹配的开始位置(犀牛书上的解释"上次匹配后的位置,用于在一个字符串中进行多次匹配"),默认值是0。 lastIndex 属性被 RegExp 对象的 exec 和 test 方法修改.并且它是可写的.
var re = /[A-Z]/;var str = "Hello,World!!!";alert(re.lastIndex);//0var arr = re.exec(str); //exec方法执行后,修改了re的lastIndex属性alert(re.lastIndex);//1var arr = re.exec(str);alert(re.lastIndex);//1re = /[A-Z]/g; //全文匹配alert(re.lastIndex);//0arr = re.exec(str);alert(re.lastIndex);//1arr = re.exec(str);alert(re.lastIndex);//7

当匹配失败(后面没有匹配),再执行exec等方法会将lastIndex设为0(开始位置)
var re = /\d/; //var re = /\d/g;效果一样var str = "Hello,World!!!";alert(re.lastIndex);//0 var arr = re.exec(str);alert(re.lastIndex);//0

当设置lastIndex的值时,如果指定了全文匹配g,则从指定的lastIndex位置开始匹配,如果匹配失败则lastIndex=0,在执行exec等方法
var re = /[A-Z]/;var str = "Hello,World!!!";alert(re.lastIndex);//0re.lastIndex=2;alert(re.lastIndex);//2var arr = re.exec(str);alert(re.lastIndex);//1arr = re.exec(str);alert(re.lastIndex);//1arr = re.exec(str);alert(re.lastIndex);//1var re = /[A-Z]/g; //全文匹配var str = "Hello,World!!!";alert(re.lastIndex);//0re.lastIndex=2;alert(re.lastIndex);//2var arr = re.exec(str);alert(re.lastIndex);//7arr = re.exec(str);alert(re.lastIndex);//0arr = re.exec(str);alert(re.lastIndex);//1arr = re.exec(str);alert(re.lastIndex);//7

关于RegExp对象实例的lastIndex属性的一些整理的更多相关文章

  1. js中如何判断属性是对象实例中的属性还是原型中的属性

    ECMAScript5中的hasOwnProperty()方法,用于判断只在属性存在与对象实例中的时候,返回true,in操作符只要通过对象能访问到属性就返回true. 因此只要in操作符返回true ...

  2. Python中对象实例的__dict__属性

    实例的__dict__并不是一个方法,而是存储与该实例相关的实例属性的字典,对类中定义的方法(函数),方法名也是属性变量,类的__dict__存储所有实例共享的变量和函数(类属性,方法等),类的__d ...

  3. js进阶正则表达式11RegExp的属性和方法(RegExp的属性和方法,就是RegExp对象.(点)什么的形式)(正则表达式执行之前会被编译)

    js进阶正则表达式11RegExp的属性和方法(RegExp的属性和方法,就是RegExp对象.(点)什么的形式)(正则表达式执行之前会被编译) 一.总结 1. RegExp的属性和方法,就是RegE ...

  4. JS中的RegExp对象常用属性和方法

    JavaScript提供了一个RegExp对象来完成有关正则表达式的操作和功能,每一条正则表达式模式对应一个RegExp实例.有两种方式可以创建RegExp对象的实例. 使用RegExp的显式构造函数 ...

  5. C#读取对象实例的值和对对象的属性自动赋值方法

    using System; using System.Data; using System.Reflection; namespace DBUtility { /// <summary> ...

  6. 原生JS:RegExp对象详解

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  7. Javascript的RegExp对象(转载自网络)

    正则表达式是一个描述字符模式的对象. JavaScript的RegExp对象和String对象定义了使用正则表达式来执行强大的模式匹配和文本检索与替换函数的方法. '***************** ...

  8. JS之RegExp对象(一)

    JavaScript提供了一个RegExp对象来完毕有关正則表達式的操作和功能,每一条正則表達式模式相应一个RegExp实例.有两种方式能够创建RegExp对象的实例.      使用RegExp的显 ...

  9. JavaScript正则表达式-RegExp对象

    RegExp对象方法 exec():与String对象的match()方法功能相同. 参数为被搜索字符串.返回数组或null. test():与String对象的search()方法功能相同. 参数为 ...

随机推荐

  1. [Spark内核] 第34课:Stage划分和Task最佳位置算法源码彻底解密

    本課主題 Job Stage 划分算法解密 Task 最佳位置算法實現解密 引言 作业调度的划分算法以及 Task 的最佳位置的算法,因为 Stage 的划分是DAGScheduler 工作的核心,这 ...

  2. DM企业建站系统v201710 sql注入漏洞分析 | 新版v201712依旧存在sql注入

    0x00 前言 本来呢,这套CMS都不想审的了.下载下来打开一看,各种debug注释,排版烂的不行. 贴几个页面看看 感觉像是新手练手的,没有审下去的欲望了. 但想了想,我tm就是新手啊,然后就继续看 ...

  3. servlet里获得jsp页面里select的选项之值

    <span style="font-size:24px;"><select name=first> <option value="1&quo ...

  4. python中的深拷贝和浅拷贝理解

    在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用.以下分两个思路来分别理解浅拷贝和深拷贝: 利用切 ...

  5. 记录CentOS环境下将Solr部署到Tomcat

    首先切换到usr/local目录 cd /usr/local/ 下载tomcat到local目录 wget http://archive.apache.org/dist/tomcat/tomcat-7 ...

  6. LevelDB的源码阅读(三) Put操作

    在Linux上leveldb的安装和使用中我们写了这么一段测试代码,内容以及输出结果如下: #include <iostream> #include <string> #inc ...

  7. tomcat 日志切割 catalina.out

    在实际生产环境中,tomcat的 catalina.out日志默认是不切割的,由于看起来很不方便,以及在备份等方面都比较麻烦.是时候切割该文件了. 环境说明 centos 7.3 tomcat 8.5 ...

  8. Java生成微信二维码及logo二维码

    依赖jar包 二维码的实现有多种方法,比如 Google 的 zxing 和日本公司的 QrCode,本文以 QrCode 为例. QrCode.jar:https://pan.baidu.com/s ...

  9. Java异常(输出[D@139a55问题)

    简单给出一段代码说明问题: public class Main { public static void main(String[] args) { double a[]={1,4,3,2}; Sys ...

  10. SQL数据开发(经典) 基本操作

    数据开发(经典) 1.按姓氏笔画排序: Select * From TableName Order By CustomerName Collate Chinese_PRC_Str oke_ci_as ...