• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >编程问答 > 正则表达式exec一个神秘的小问题

正则表达式exec一个神秘的小问题

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-07

佚名通过本文主要向大家介绍了exec函数正则表达式,正则表达式exec,js 正则表达式 exec,正则表达式,正则表达式语法等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题:正则表达式exec一个神秘的小问题
描述:

var regexAbc = /a(b)c/gi
console.log(regexAbc.exec("abc")) // ["abc", "b"]
console.log(regexAbc.exec("abc")) // null
console.log(regexAbc.exec("abc")) // ["abc", "b"]
console.log(regexAbc.exec("abc")) // null

为什么会出现这样结果不一样的情况

附送参考链接:

  • http://stackoverflow.com/questions/11477415/why-does-javascripts-regex-exec-not-always-return-the-same-value

  • http://stackoverflow.com/questions/4724701/regexp-exec-returns-null-sporadically

  • http://stackoverflow.com/questions/10167323/regexp-exec-returns-null-when-called-repeatedly-in-firefox


解决方案1:

A JavaScript RegExp object is stateful.

When the regex is global, if you call a method the same regex object, it will start from the index past the end of the last match.

When no more matches are found, the index is reset to 0 automatically.

javascript 的正则表达式是有状态的。尤其是exec方法,是有副作用的。当其匹配成功的时候reg.lastIndex会被改变。因此导致了间隔的返回null的情况

To reset it manually, set the lastIndex property.

每次匹配完可以通过这样手动重置,以保证下一次匹配的结果是正常的

reg.lastIndex = 0;

尤其是在循环中使用同一只正则表达式的时候,尤其需要注意这一点

解决方案2:

http://www.w3school.com.cn/jsref/jsref_exec_regexp.asp
如果 exec() 找到了匹配的文本,则返回一个结果数组。否则,返回 null。此数组的第 0 个元素是与正则表达式相匹配的文本,第 1 个元素是与 RegExpObject 的第 1 个子表达式相匹配的文本(如果有的话),第 2 个元素是与 RegExpObject 的第 2 个子表达式相匹配的文本(如果有的话),以此类推。除了数组元素和 length 属性之外,exec() 方法还返回两个属性。index 属性声明的是匹配文本的第一个字符的位置。input 属性则存放的是被检索的字符串 string。我们可以看得出,在调用非全局的 RegExp 对象的 exec() 方法时,返回的数组与调用方法 String.match() 返回的数组是相同的。
但是,当 RegExpObject 是一个全局正则表达式时,exec() 的行为就稍微复杂一些。它会在 RegExpObject 的 lastIndex 属性指定的字符处开始检索字符串 string。当 exec() 找到了与表达式相匹配的文本时,在匹配后,它将把 RegExpObject 的 lastIndex 属性设置为匹配文本的最后一个字符的下一个位置。这就是说,您可以通过反复调用 exec() 方法来遍历字符串中的所有匹配文本。当 exec() 再也找不到匹配的文本时,它将返回 null,并把 lastIndex 属性重置为 0。
提示和注释
重要事项:如果在一个字符串中完成了一次模式匹配之后要开始检索新的字符串,就必须手动地把 lastIndex 属性重置为 0。
提示:请注意,无论 RegExpObject 是否是全局模式,exec() 都会把完整的细节添加到它返回的数组中。这就是 exec() 与 String.match() 的不同之处,后者在全局模式下返回的信息要少得多。因此我们可以这么说,在循环中反复地调用 exec() 方法是唯一一种获得全局模式的完整模式匹配信息的方法。


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 正则表达式exec一个神秘的小问题
  • 我的正则表达式exec方法有不懂,问一下各位

相关文章

  • 2017-06-07 Windows下Qt应该怎么连接Redis?
  • 2017-06-07 如何运行Flask源码中的测试用例
  • 2017-06-07 PHP通过扩展连接redis和通过socket连接redis有何不同?你推荐哪个?
  • 2017-06-07 jboss服务器下直接点击链接打开excel后浏览器显示乱码
  • 2017-06-07 (python)flaskjinja2共享变量
  • 2017-06-07 (shell)如何去掉Linux终端输出的颜色
  • 2017-06-07 JbossEjb
  • 2017-06-07 七牛服务的稳定性
  • 2017-06-07 python正则表达式,怎么不能搜索所有的符合项。
  • 2017-06-07 wordpress七牛云上传图片出错!

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • PYTHON成功安装pymssql但import报错
    • 触发持久化处理,队列设置无效
    • (python)使用crontab-e定时任务操作数据库失败
    • laravel51homestead026安装中,在vagrantup命令时出错,大家有遇到同样问题么?
    • (python)c++枚举类型保存为二进制文件,占多少个二进制位?
    • pythonopen读写文件时如何实现异步IO,解决IO瓶颈带来的性能问题
    • vagranthomestead配置多域名失败
    • (python)django使用jinja2中文变量的问题
    • 亚马逊服务器外网不能访问
    • 对话框打开时命令无法执行suprocess执行命令,中文乱码

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有