Javascript正则表达式之lastIndex属性问题

一次写正则的时候遇到了一些问题,是关于就JavaScript的RegExp对象的lastIndex属性的,由于这个很烦人的属性导致代码除了一些问题,在此作一个记录

每个RegExp对象都包含5个属性,source、global、ignoreCase、multiline、lastIndex

source:是一个只读的字符串,包含正则表达式的文本

global:是一个只读的布尔值,看是否带有修饰符g,g表示全局, 默认false

ignoreCase:是一个只读的布尔值,看是否带有修饰符i,i表示是否忽略大小写,默认false

multiline:是一个只读的布尔值,看是否带有修饰符m,m表示是否多行匹配,默认false

lastIndex:是一个可读/写的整数,如果匹配模式中带有g修饰符,这个属性存储在整个字符串中下一次检索的开始位置,这个属性会被如exec( ) 和 test( ) 这样的方法用到

当调用test( )的正则表达式对象具有修饰符g时,因为它从lastIndex指定的位置处开始检索某个字符串,如果它找到了一个匹配结果,那么它就立即设置lastIndex为紧挨着匹配子串的字符位置

var str="JavaScript";
var reg=/JavaScript/g;
console.log(reg.test(str)); //打印 true
console.log(reg.test(str)); //打印 false

同样的正则表达式,却打印的不一样

var str="JavaScript";
var reg=/JavaScript/g;
console.log(reg.test(str)); //打印 true
console.log(reg.lastIndex);
//打印10,因为匹配到了JavaScript,所以设置lastIndex为匹配结果紧挨着的字符位置
console.log(reg.test(str));
//打印 false,因为从lastIndex位置检索字符串,已经没有匹配结果了
console.log(reg.lastIndex);
//打印0,因为没有匹配到结果,所以将lastIndex重置为0

这里注意一点,如果第一次调用test( )匹配结束后,我们手动将lastIndex重置为0,那么第二次调用test( ),同样可以打印true

var str="java JavaScript java";
var reg=/JavaScript/g;
console.log(reg.test(str)); //打印 true
reg.lastIndex=0;
console.log(reg.test(str)); //打印 true

另外我们也可以每次在匹配的时候实例化一个RegExp对象,这样也不会出错,但是这样会增加内存的消耗,所以不推荐这样做

上面说的关于lastIndex的问题,是因为有修饰符g,如果不带有修饰符g,就不用担心这些问题了

此条目发表在javascript分类目录。将固定链接加入收藏夹。