当前位置:首页 > 日记 > 正文

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

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

前言

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

let reg = /[\d]/g//undefinedreg.test(1)//truereg.test(1)//false

lastIndex

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

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

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

解决

  1、不使用 g 修饰符

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

  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)); //truealert(regexp.test(str)); //falsealert(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对正则表达式结果的影响,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

相关文章

浅谈php中变量的数据类型判断函数

浅谈php中变量的数据类型判断函数

数据类型,函数,变量,浅谈,电脑软件,在php中我们可以通过 var_dump()打印出变量的类型和值。同时我们可以通过一些函数判断变量的类型。如果只是想得到一个变量的数据类型,可以使用gettype()函数,gettype($t) 返回$t的数据类型的字符串,要是$t…

ps怎么给喷泉静态图添加动态效果?

ps怎么给喷泉静态图添加动态效果?

动态,喷泉,静态,效果,电脑软件,想要使用ps给喷泉图制作正在喷喷泉的动态效果,该怎么制作呢?下面我们就来看看详细的教程。软件名称:Adobe Photoshop 8.0 中文完整绿色破解版软件大小:150.1MB更新时间:2015-11-041、首先启动Photoshop cs5,执行文…

更改3389端口方法

更改3389端口方法

方法,端口,电脑软件, 今天黑客入侵了。公司服务器。搞得今天忙的要死 。查漏洞啊,修复漏洞,打补丁什么的。一个字累, 还改了下3389.下面的步骤: 步骤1:打开注册表编辑器。 开始——运行——regedit 步骤2:查找注…

PHP实现无限极分类生成分类树的方

PHP实现无限极分类生成分类树的方

无限极分类,方法,分类,电脑软件,PHP,本文实例讲述了PHP实现无限极分类生成分类树的方法。分享给大家供大家参考,具体如下:现在的分类数据库设计基本都是:每一个分类有一个id主键字段,一个pid指向父类的id,这样便可实现无限级分类,取出的数据就是…

word批量居中对齐

word批量居中对齐

对齐,批量,电脑软件,word,Word软件,如果我们只是把插入的一张图片居中对齐,操作很简单,选中需要居中对齐的图片,然后按下快捷键CTRL+E就OK!我们继续,如果一篇word里面插入了N张图片,那么如何一次性批量对文档里面的图片进行居中对齐操作呢?word图…

bootstrap模态框嵌套、tabindex属

bootstrap模态框嵌套、tabindex属

属性,嵌套,模态框,示例代码,电脑软件,模态框嵌套在开发中,遇到需要通过点击事件触发第一个模态框,触发后通过事件唤起第二个模态框,并且通过事件触发第三个模态框;即模态框嵌套。模态框嵌套需要用一个模态框包裹所涉及嵌套的模态框,从而点击触发…

详解phpmyadmin相关配置与错误解决

详解phpmyadmin相关配置与错误解决

错误解决,配置,详解,电脑软件,phpmyadmin,详解phpmyadmin相关配置与错误解决缺少mcrypt扩展sudo apt-get install php5-mcryptsudo php5enmod mcrypt检查:/etc/php5/apache2/conf.d/ /etc/php5/mods-available/ 中是否有mcrypt文件sudo serv…

提示此windows副本不是正版的win7

提示此windows副本不是正版的win7

副本,系统,提示,解决方法,电脑软件,windows不是正版的提示一旦出现,那就表示我们的windows需要激活。在激活之前,我们的桌面主题就会无法正常更改,哪怕换了壁纸或者主题我们的电脑显示屏依然会经常黑屏。虽然并不会影响我们使用,但是主题无法更…

jQuery阻止移动端遮罩层后页面滚动

jQuery阻止移动端遮罩层后页面滚动

移动端,遮罩层,页面,电脑软件,jQuery,css代码:.ovfHiden{overflow: hidden;height: 100%;}jquery: $(".header_right").click(function(){ $('html,body').addClass('ovfHiden'); //使网页不可滚动 $(".searchbox").show(); …

Windows Server 2003网站服务器下

Windows Server 2003网站服务器下

常见问题,网站服务器,电脑软件,Windows,Server,1,在WIN2003如何调用ASP页面如果操作系统是Windows Server 2003,安装完Internet信息服务项目(IIS),在Internet服务管理器里,选择"web服务扩展",把"Active Server Pages"设为允许。2,关于父目录 …

Excel2007中出现加载项消失的处理

Excel2007中出现加载项消失的处理

加载,步骤,处理方法,电脑软件,  某些简装版的word(尤其是托别人重装系统后自带的word)打开后会发现在菜单中没有“加载项”这一栏,导致某些功能无法使用。今天,小编就教大家在Excel2007中出现加载项消失的处理方法。Excel2007中…

win10删除自带输入法

win10删除自带输入法

输入法,删除,自带,电脑软件,右键点击Win10系统的开始菜单,选择弹出菜单里的控制面板,如下图所示:在控制面板里面我们选择“时钟,语言和区域”里面的更换输入法,如下图所示:然后在出现的语言窗口中点击右侧的 选项,如下图所示:点击需要删…