RegExp对象的exec方法
RegExp对象的exec方法和String对象的match方法用法十分相似,分两篇博客讲讲其各自的用法和它们之间的异同。
下一篇讨论match方法的用法和两者的异同。
定义及语法
【定义】
exec() 方法用于检索字符串中的正则表达式的匹配。
【语法】
RegExpObject.exec(string)
【返回值】
返回一个数组,其中存放匹配的结果,第一项为与整个模式匹配的字符串,其他项是与模式中的捕获组匹配的字符串,且数组还包含两个属性:index和input。其中index表示匹配项在字符串中的位置,input表示应用正则表达式的字符串。如果未找到匹配,则返回值为 null。
RegExp对象是否为全局正则表达式(是否有全局标志g)产生的结果有所不同,因此以下我们分两种情况讲解:
1)RegExp对象不是全局表达式;
2)RegExp对象是全局表达式。
RegExp对象不是全局表达式
var str="web2.0 .net2.0";
var pattern=/(\w+)(\d)\.(\d)/;//没有全局标志g
console.log(pattern.exec(str));
结果如下:

第一项:web2.0,与整个模式匹配的结果,也就是与/(\w+)(\d)\.(\d)/匹配的结果;
第二项:web,与第一个匹配组匹配的结果,也就是与(\w+)匹配的结果;
第三项:2,与第二个匹配组匹配的结果,也就是与(\d)匹配的结果;
第四项:0,与第三个匹配组匹配的结果,也就是与(\d)(第二个(\d))匹配的结果;
属性一:index:0,匹配项在字符串中的位置,也就是数组第一项的匹配字符串的位置。
属性二:input:"web2.0 .net2.0",也就是输入参数str。
以上结果就是每次执行exec方法所得的结果的格式,如果有更多捕获组,结果中会按顺序列出所有的结果。
这个时候,如果我们再执行一次exec方法:
var str="web2.0 .net2.0";
var pattern=/(\w+)(\d)\.(\d)/;//没有全局标志g
console.log(pattern.exec(str));
console.log(pattern.exec(str));
两次得到的结果会完全相同(设置了全部属性就会不一样),也就是当RegExp对象没有全局标志时,exec方法每次都只是从头开始匹配,每次都是返回第一个匹配项,net2.0尽管也满足RegExp对象,但不会被检索到。
RegExp对象是全局表达式
var str="web2.0 .net2.0";
var pattern=/(\w+)(\d)\.(\d)/g;//有全局标志g
console.log(pattern.exec(str));
console.log(pattern.exec(str));
两次的结果如下:

可以看出两次结果不同,第二次的结果是在第一次结果的基础上继续往后查找,而不是从头开始。因此,是否设置全局标志g,不会影响第一次的执行结果,但是会决定第二次及以后的结果。我们可以通过RegExp的lastIndex属性(表示开始搜索下一个匹配项的字符位置)验证一下:
var str="web2.0 .net2.0";
var pattern=/(\w+)(\d)\.(\d)/g;//有全局标志g
var match1= pattern.exec(str);
console.log(pattern.lastIndex);//6
var match2= pattern.exec(str);
console.log(pattern.lastIndex);//14
可以看到第一次执行exec后,RegExp的lastIndex为6;第二次执行exec后,RegExp的lastIndex为14,说明每次搜索的起点是接在上次的匹配结果之后的。
我们可以对比一下不设置全局标志的结果:
var str="web2.0 .net2.0";
var pattern=/(\w+)(\d)\.(\d)/;//没有全局标志g
var match1= pattern.exec(str);
console.log(pattern.lastIndex);//0
var match2= pattern.exec(str);
console.log(pattern.lastIndex);//0
两次的lastIndex都是0,表示下一次仍然从头开始搜索。
总结
1)exec是RegExp对象的方法,接受参数为字符串;
2)exec执行一次只返回包含一个匹配项信息的数组,数组格式为[与整个模式匹配的字符串,与第一个捕获组匹配的字符串,与第二个捕获组匹配的字符串,……],数组有两个属性,分别为匹配得到的字符串的位置index和输入参数字符串input;
3)不设置全局标志g时,exec方法每次都从头开始检索,并返回第一个匹配项;设置全局标志g时,exec方法从上次检索的重点开始检索,也就是lastIndex值的位置。
RegExp对象的exec方法的更多相关文章
- JavaScript RegExp对象的exec()方法
JavaScript RegExp对象的exec()方法用来匹配字符串,它的行为与match()有些不同. 对于RegExpObject.exec(),w3school上面是这样介绍的: exec() ...
- PDO 学习与使用 ( 一 ) :PDO 对象、exec 方法、query 方法与防 SQL 注入
1.安装 PDO 数据库抽象层 PDO - PHP Data Object 扩展类库为 PHP 访问数据库定义了一个轻量级的.一致性的接口,它提供了一个数据访问抽象层,针对不同的数据库服务器使用特定的 ...
- js进阶正则表达式13RegExp对象方法(RegExp对象的方法:compile,test,exec)(子表达式 var reg1=/([a-z]+)\d/)
js进阶正则表达式13RegExp对象方法(RegExp对象的方法:compile,test,exec)(子表达式 var reg1=/([a-z]+)\d/) 一.总结 1.RegExp对象有三个方 ...
- JavaScript RegExp.exec() 方法
定义和用法: exec() 方法用于检索字符串中的正则表达式的匹配. 语法: RegExpObject.exec(string); RegExpObject:必须参数,正则表达式: string:必须 ...
- js进阶正则表达式11RegExp的属性和方法(RegExp的属性和方法,就是RegExp对象.(点)什么的形式)(正则表达式执行之前会被编译)
js进阶正则表达式11RegExp的属性和方法(RegExp的属性和方法,就是RegExp对象.(点)什么的形式)(正则表达式执行之前会被编译) 一.总结 1. RegExp的属性和方法,就是RegE ...
- javascript exec方法
题目 取出 "[大哭][尴尬][发怒][发怒][调皮][调皮][呲牙]" 串中[]里面的东西 思路 正则匹配,/\[(.+?)\]/ig; exec方法循环 exec() 方法的功 ...
- JavaScript:exec()方法的用法及说明
最近在看某知名js框架的源码,突然间发现自己对exec()方法竟然不太理解,然后就仔细的分析了一下这个方法 下面贴个exec()方法使用的代码出来 rquickExpr = /^(?:\s*(< ...
- 正则表达式exec方法的陷阱
http://www.w3school.com.cn/jsref/jsref_exec_regexp.asp exec() 方法的功能非常强大,它是一个通用的方法,而且使用起来也比 test() 方法 ...
- JavaScript正则表达式(Regular Expression):RegExp对象
第一部分:新建正则表达式 JavaScript中正则表达式是参照Perl 5(一门历史很悠久的语言,现在tiobe编程语言排行依然在10名左右)建立的. 新建正则表达式的方法有两种: 1.使用字面量( ...
随机推荐
- Dota2APP--第二天
一.今天的任务 1)自定义标签栏控制器 2)自定义导航栏控制器 3)在新特性界面播放音频 1.第一个任务:自定义标签栏控制器 原因:默认的TabbarViewController不能满足项目的需求. ...
- Kotlin Eclipse 环境搭建
Kotlin是JetBrains开发的基于JVM的语言.JetBrains是一家捷克的软件开发公司,该公司位于捷克的布拉格,研发了IntelliJ IDEA这款相对于Eclipse有较大改善的大名鼎鼎 ...
- Log中关于zVideoApp与zChatApp之间的消息传递可以搜索以下字符串
[CSSBConfIPCAgent::OnMessageReceived] (这是zVideoApp端的) 和 [CSSBPTIPCListener::OnMessageReceived] ...
- Android动画及滑动事件冲突解决(转载)
原文链接:http://blog.csdn.net/singwhatiwanna/article/details/38168103 Android开发中动画和事件处理是程序员迈向高手的必经之路,也是重 ...
- Mac下安装Iterm2终端工具
一般Iterm2是结合oh-my-zsh一起使用,但是如果不喜欢zsh也可以单独使用.Iterm2有个亮点就是可以通过快捷键快速启动. 安装步骤: 1.下载: http://www.iterm2.co ...
- python中的生成器(二)
一. 剖析一下生成器对象 先看一个简单的例子,我们创建一个生成器函数,然后生成一个生成器对象 def gen(): print('start ..') for i in range(3): yield ...
- TensorFlow架构与设计:概述
TensorFlow是什么? TensorFlow基于数据流图,用于大规模分布式数值计算的开源框架.节点表示某种抽象的计算,边表示节点之间相互联系的张量. TensorFlow支持各种异构的平台,支持 ...
- WPF 自定义ScrollViwer
ScrollViewer自定义样式 ScrollViewer在各种列表.集合控件中广泛使用的基础组建,先看看效果图: 如上图,ScrollViewer简单来说分两部分,一个横向的滚动条,一个垂直滚动条 ...
- Linux常用命令之sed(2)
Sed SED的英文全称是 Stream EDitor,它是一个简单而强大的文本解析转换工具,在1973-1974年期间由贝尔实验室的Lee E. McMahon开发,今天,它已经运行在所有的主流操作 ...
- python解决处理中文的问题
脚本开头添加默认编码 python源码中出现了中文字符或要处理中文字符,运行时会出现错误,解决方法是,开头加入字符编码声明: #! /usr/bin/env python # -*- coding:u ...