关于RegExp对象实例的lastIndex属性的一些整理
今天在做正则循环匹配,碰到一个怪问题,第一次可以匹配上,但循环第一次之后,就无法匹配上了。猛然想起,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属性的一些整理的更多相关文章
- js中如何判断属性是对象实例中的属性还是原型中的属性
ECMAScript5中的hasOwnProperty()方法,用于判断只在属性存在与对象实例中的时候,返回true,in操作符只要通过对象能访问到属性就返回true. 因此只要in操作符返回true ...
- Python中对象实例的__dict__属性
实例的__dict__并不是一个方法,而是存储与该实例相关的实例属性的字典,对类中定义的方法(函数),方法名也是属性变量,类的__dict__存储所有实例共享的变量和函数(类属性,方法等),类的__d ...
- js进阶正则表达式11RegExp的属性和方法(RegExp的属性和方法,就是RegExp对象.(点)什么的形式)(正则表达式执行之前会被编译)
js进阶正则表达式11RegExp的属性和方法(RegExp的属性和方法,就是RegExp对象.(点)什么的形式)(正则表达式执行之前会被编译) 一.总结 1. RegExp的属性和方法,就是RegE ...
- JS中的RegExp对象常用属性和方法
JavaScript提供了一个RegExp对象来完成有关正则表达式的操作和功能,每一条正则表达式模式对应一个RegExp实例.有两种方式可以创建RegExp对象的实例. 使用RegExp的显式构造函数 ...
- C#读取对象实例的值和对对象的属性自动赋值方法
using System; using System.Data; using System.Reflection; namespace DBUtility { /// <summary> ...
- 原生JS:RegExp对象详解
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
- Javascript的RegExp对象(转载自网络)
正则表达式是一个描述字符模式的对象. JavaScript的RegExp对象和String对象定义了使用正则表达式来执行强大的模式匹配和文本检索与替换函数的方法. '***************** ...
- JS之RegExp对象(一)
JavaScript提供了一个RegExp对象来完毕有关正則表達式的操作和功能,每一条正則表達式模式相应一个RegExp实例.有两种方式能够创建RegExp对象的实例. 使用RegExp的显 ...
- JavaScript正则表达式-RegExp对象
RegExp对象方法 exec():与String对象的match()方法功能相同. 参数为被搜索字符串.返回数组或null. test():与String对象的search()方法功能相同. 参数为 ...
随机推荐
- jQuery 属性(十二)
属性 描述 context 在版本 1.10 中被弃用.包含传递给 jQuery() 的原始上下文. jquery 包含 jQuery 版本号. jQuery.fx.interval 改变以毫秒计的动 ...
- Presto集群部署
前言: 随着大数据的普及,大部分企业的大数据查询与统计渐渐出现瓶颈.虽说存储方面有分布式的HDFS,HBSE,MongoDB等可以应对,但是面对千万级别(1x10^7)界别的数据量查询时,以上组件也不 ...
- javascript 之基本数据类型、引用数据类型区别--02
栈(stack)和堆(heap) stack为自动分配的内存空间,它由系统自动释放:而heap则是动态分配的内存,大小不定也不会自动释放. 基本类型和引用类型 基本类型:存放在栈内存中的简单数据段,数 ...
- 消费五分钟,小白也能了解的经典技术:关于IP负载均衡(LVS之NAT)
这里准备以两篇文章来大概讲述一下LVS负载均衡 NAT TUN/DR和共享存储 前言: 为什么搭建LVS: 若一台服务器只能支持10人在线.那么有100人访问,则需要多少台服务器. 这个不言而喻:10 ...
- 【转】 Git——如何将本地项目提交至远程仓库
1.(先进入项目文件夹)通过命令 git init 把这个目录变成git可以管理的仓库 git init 2.把文件添加到版本库中,使用命令 git add .添加到暂存区里面去,不要忘记后面的小数点 ...
- Python进阶内容(二)--- 装饰器
谈装饰器前,需要明白一件事,Python 中的函数和 Java.C++不太一样,Python 中的函数可以像普通变量一样当做参数传递给另外一个函数,例如: def foo(): print(" ...
- 使用Python实现的杨辉三角
def triangel(): print ' '*(20*3)+str(1) #定义起始两行 print ' '*(19*3)+str(1)+' '*5+str(1) for i in range( ...
- POI读取excel工具类(xls,xlsx通用)
package com.boot.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotF ...
- python Database Poll for SQL SERVER
python连接SQL SERVER数据库: Python编程中可以使用SQL SERVER 进行数据库的连接及诸如查询/插入/更新等操作,但是每次连接SQL SERVER 数据库请求时,都是独立的去 ...
- [译]Python面试中8个必考问题
1.下面这段代码的输出结果是什么?请解释. def extendList(val, list=[]): list.append(val) return list list1 = extendList( ...