浅析lastIndex对正则表达式结果的影响

前言

  今天遇到一个问题,用正则表达式去检查同一个字符串时,交替返回true和false。无奈之下,重新翻了翻权威指南,发现罪魁祸首原来是lastIndex。可在控制台尝试下

let reg = /[\d]/g
//undefined
reg.test(1)
//true
reg.test(1)
//false

lastIndex

  lastIndex在权威指南中是如下解释:它是一个可读/写的整数。如果匹配模式带有g修饰符,这个属性存储在整个字符串中下次索引的开始位置,这个属性会被exec()和test()用到。还是上面的例子,观察下lastIndex属性

let reg = /[\d]/g   //有修饰符g
//undefined
reg.lastIndex
//0
reg.test(1)
//true
reg.lastIndex   //匹配一次后,lastIndex改变
//1
reg.test(1)    //从index 1 开始匹配
//false
reg.lastIndex
//0
reg.test(1)
//true
reg.lastIndex
//1

  第一次使用test()匹配成功后,lastIndex被设为匹配到的结束位置,就是1;第二次再test()时,从index 1 开始匹配,匹配失败,lastIndex重置为0 。这样就造成了匹配结果与预期不符

解决

  1、不使用 g 修饰符

reg = /[\d]/
///[\d]/
reg.test(1)
//true
reg.test(1)
//true
reg.lastIndex
//0
reg.test(1)
//true
reg.lastIndex
0

  2、test()之后手动设置lastIndex = 0

浅析正则表达式对象lastIndex属性

js中正则表达式的使用方式有两种,一种是正则表达式对象的方法,一种是字符串对象的方法,前者有exec(str)、test(str)两个方法,后者有match(regexp)、replace(regexp)、search(regexp)、split(search)四个方法。当作为正则表达式对象的方法使用时,要特别注意它的lastIndex属性。

var regexp = /abcd/g;
var str = 'abcdefg';
alert(regexp.test(str)); //true
alert(regexp.test(str)); //false
alert(regexp.test(str)); //true

上面这段代码运行的结果分别是弹出true、false、true,考虑到用的是同一个正则模式,是不是让人有点迷糊?

其实这正是正则表达式对象的lastIndex属性在作怪。lastIndex从字面上来讲就是最后一个索引,实际上它的意思是正则表达式开始下一次查找的索引位置,第一次的时候总是为0的,第一次查找完了的时候会把lastIndex的值设为匹配到得字符串的最后一个字符的索引位置加1,第二次查找的时候会从lastIndex这个位置开始,后面的以此类推。如果没有找到,则会把lastIndex重置为0。要注意的是,lastIndex属性只有在有全局标志正则表达式中才有作用,如果我们把上面代码中正则表达式的g标志去掉,那么三次弹出的就都是true了。

exec()方法同样是如此,exec()方法返回的是一个数组,数组的第一个元素是匹配到的字符串,之后的元素则分别对应匹配到的字串,也就是正则表达式中用括号括起来的那些。如果使用exec()方法的正则表达式没有全局标志,则只会匹配第一个,如果正则表达式有全局标志,则可以循环使用exec()来得到所有的匹配,直到exec()返回null为止,也就是找不到匹配了。这里能够循环使用同一个正则表达式的exec()方法,靠的就是lastIndex,因为带全局标志的正则表达式每次匹配后都会更新lastIndex的值作为下次查找匹配的起点。

最后要说明的是字符串的正则方法里lastIndex属性是不起作用的,不管正则模式是不是全局的。

总结

以上所述是小编给大家介绍的lastIndex对正则表达式结果的影响,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • JS中正则表达式要注意lastIndex属性

     说明 这篇文章,主要和大家聊聊JavaScript中RegExp对象的属性. 解释 每个RegExp对象都包含5个属性,source.global.ignoreCase.multiline.lastIndex. source:是一个只读的字符串,包含正则表达式的文本. var reg = /JavaScript/; reg.source; //返回 JavaScript global:是一个只读的布尔值,看这个正则表达式是否带有修饰符g. 修饰符g,是全局匹配的意思,检索字符串中所有的匹配.

  • js正则表达式之RegExp对象属性lastIndex,lastMatch,lastParen,lastContext,rightContext属性讲解

    1.lastIndex属性,返回匹配内容的最后一个索引位置,也就是下一个匹配的开始位置,注意字符串索引从0开始 代码: //设置要匹配的内容 var objStr="abfdabcd"; //设置匹配的正则表达式 var re=/abc/; //输出匹配前的字符串 document.write("未匹配前的字符串"+objStr+""); //输出匹配的内容 document.write("匹配的内容"+objStr.matc

  • Javascript lastIndex 正则表达式的一个疑惑

    看下面这段代码: function test(s){ var reg = /./g; console.log(reg.exec(s)); console.log(reg.lastIndex); var reg = /./g; console.log(reg.exec(s)); console.log(reg.lastIndex); } test("abcd"); test("efgh"); 我以为输出的lastIndex的值应该都是1,但是实际上的输出如下: a 1

  • 浅析正则表达式中的lastIndex以及预查

    依次写出下列输出内容. var reg1 = /a/; var reg2 = /a/g; console.log(reg1.test('abcabc')); // true console.log(reg1.test('abcabc')); // true console.log(reg1.test('abcabc')); // true console.log(reg1.test('abcabc')); // true console.log(reg2.test('abcabc')); //

  • 浅析lastIndex对正则表达式结果的影响

    前言 今天遇到一个问题,用正则表达式去检查同一个字符串时,交替返回true和false.无奈之下,重新翻了翻权威指南,发现罪魁祸首原来是lastIndex.可在控制台尝试下 let reg = /[\d]/g //undefined reg.test(1) //true reg.test(1) //false lastIndex lastIndex在权威指南中是如下解释:它是一个可读/写的整数.如果匹配模式带有g修饰符,这个属性存储在整个字符串中下次索引的开始位置,这个属性会被exec()和te

  • 详谈lastIndex对正则结果的影响

    前言 今天遇到一个问题,用正则表达式去检查同一个字符串时,交替返回true和false.无奈之下,重新翻了翻权威指南,发现罪魁祸首原来是lastIndex.可在控制台尝试下 let reg = /[\d]/g //undefined reg.test(1) //true reg.test(1) //false lastIndex lastIndex在权威指南中是如下解释:它是一个可读/写的整数.如果匹配模式带有g修饰符,这个属性存储在整个字符串中下次索引的开始位置,这个属性会被exec()和te

  • Javascript中正则表达式的使用及基本语法

    前面的话 正则表达式在人们的印象中可能是一堆无法理解的字符,但就是这些符号却实现了字符串的高效操作.通常的情况是,问题本身并不复杂,但没有正则表达式就成了大问题.javascript中的正则表达式作为相当重要的知识,本文将介绍正则表达式的基础语法 定义 正则表达式(Regular Expression)是一门简单语言的语法规范,是强大.便捷.高效的文本处理工具,它应用在一些方法中,对字符串中的信息实现查找.替换和提取操作 javascript中的正则表达式用RegExp对象表示,有两种写法:一种

  • javascript 正则表达式相关应介绍

    string 对象 1.str.match(RegExp) 在str中搜索匹配RegExp的字符串并保存在一个数组内返回, 如果RegExp不是全局设置(/g),仅匹配一次 复制代码 代码如下: ("abc112dwfwabcwef2abc3wfwabcasqf453abcqwf24j234h").match(/abc\d*/g); //结果 ["abc112", "abc", "abc3", "abc",

  • jmeter正则表达式实例详解

    过年前产假归来,jmeter很多知识生疏了,这两天打开jmeter摸索了几下,老了记不住,还是准备弄个jmeter系列随笔吧. 言归正传,使用jmeter时经常有这样的情况:一个完整的操作流程,需先完成某个操作,获得某个值或数据信息,然后才能进行下一步的操作(也就是常说的关联/将上一个请求的响应结果作为下一个请求的参数): 在jmeter中,利用正则表达式提取器来轻松帮助我们完成这一动作.正则表达式就是用于描述这些规则的工具.换句话说,正则表达式就是记录文本规则的代码.学习正则表达式最好就是从实

  • jmeter-正则表达式实例讲解

    目录 实例1:从JDBC查询数据,并提取查询结果 实例3(简单):提取单个字符串 实例4(简单):提取多个字符串 实例5(简单):找到所有小数的数字,比如10.2 实例6(简单):找到所有小数点后的数字 实例7(简单):找到第一个有小数的数字 实例8(简单):找到所有小数的数字 正则表达式语法 过年前产假归来,jmeter很多知识生疏了,这两天打开jmeter摸索了几下,老了记不住,还是准备弄个jmeter系列随笔吧. 言归正传,使用jmeter时经常有这样的情况:一个完整的操作流程,需先完成某

随机推荐