今天在做正则循环匹配,碰到一个怪问题,第一次可以匹配上,但循环第一次之后,就无法匹配上了。猛然想起,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. Invalid bound statement (not found): com.shizongger.chapter2.mapper.UserMapper.insertUser 解决方案

    在配置MyBatis时报错信息如下: Invalid bound statement (not found): com.shizongger.chapter2.mapper.UserMapper.in ...

  2. jQuery源码解析资源便签

    最近开始解读jQuery源码,下面的链接都是搜过来的,当然妙味课堂 有相关的一系列视频,长达100多期,就像一只蜗牛慢慢爬, 至少品读三个框架,以后可以打打怪,自己造造轮子. 完全理解jQuery源代 ...

  3. 【python3之文件操作】

    一.文件操作 1.文件处理的流程 1)打开文件,得到文件句柄并赋值给一个变量 2)通过句柄对文件进行操作 3)关闭文件 例如: f = open('chenli.txt') #打开文件 first_l ...

  4. K:树与二叉树

    相关介绍:  树(英语:tree)是一种抽象数据类型(ADT)或是作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合.它是由n(n>0)个有限节点组成的一个具有层次关系的集合.把它 ...

  5. 原生js写ajax请求(复习)

    今天本地想测试一个接口,不想用框架想用js快速完成,突然发现,我居然忘了这个最基本的代码.好吧,只能复习一波. 在框架泛滥的今天,用惯$.ajax(),axios,superAgent等框架的你们,还 ...

  6. Es6主要特征详解

    一.简介 本文将对es6的最佳特性进行分享和讲解.es6也称ES6/ECMAScript2015,在2015年诞生,但是目前实际开发中还很多用的是ES5(2009年),原因就是很多的浏览器不支持新的语 ...

  7. python网络数据采集(低音曲)

    废话不多说,马上开始. 上次我们说到遍历单个域名,今天我们来写一个爬对应词条的脚本,他会遍历整个网址直到爬完对应词条. 代码: from urllib.request import urlopen f ...

  8. 信息学奥赛一本通算法(C++版)基础算法:高精度计算

    高精度加法(大位相加) #include <bits/stdc++.h> using namespace std; int main() { ],b1[]; ],b[],c[];//a,b ...

  9. Vijos P1448 校门外的树【多解,线段树,树状数组,括号序列法+暴力优化】

    校门外的树 描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的…… 如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作: K=1,K= ...

  10. Codeforces-8VC Venture Cup 2016-Elimination Round-626A.暴力 626B.水题 626C.二分

    A. Robot Sequence time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...