javascript 中String.match()与RegExp.exec()的区别说明


Posted in Javascript onJanuary 10, 2013

1. 这两个方法,如果匹配成功,返回一个数组,匹配失败,返回null。
2. 当RegExp的global属性为false时,这两个方法的返回数组是一样的。

数组的第0个元素是整个pattern的第一个匹配字符串,接下来的元素是pattern第一个匹配中的子匹配字符串。

此外,数组还有index和input两个额外属性,index是匹配字符串的起始位置,input是整个输入字符串。

此时,RegExp的lastIndex属性一直是0。
demo:

var s = 'this is a string'; 
var p = /\b\w*(i)s\b/; 
var rm = s.match(p); 
var re = p.exec(s); 
console.log('match_array: ' + JSON.stringify(rm)); 
console.log('match_array_index: ' + rm.index); 
console.log('match_array_input: ' + rm.input); 
console.log('----------------------------'); 
console.log('exec_array: ' + JSON.stringify(re)); 
console.log('exec_array_index: ' + re.index); 
console.log('exec_array_input: ' + re.input);

显示结果为(firefox控制台):
match_array: ["this","i"] 
match_array_index: 0 
match_array_input: this is a string 
---------------------------- 
exec_array: ["this","i"] 
exec_array_index: 0 
exec_array_input: this is a string

3. 当RegExp的global属性为true时,返回的数组是不同的。

match方法返回的数组包含着所有匹配字符串,没有子匹配字符串和额外属性。此时,lastIndex属性无效。

exec方法返回的数组格式与global为false时一样,只是此时RegExp的lastIndex属性有效,匹配是从lastIndex所指示的字符开始的,并且方法执行后会将lastIndex置为本次匹配字符串的下一个字符处,所以循环执行exec方法时会依次匹配整个字符串,直到字符串最后返回null,并将lastIndex置0。
demo:

var s = 'this is a string'; 
var p = /\b\w*(i)s\b/g; 
var rm = s.match(p); 
var re; 
console.log('match_array: ' + JSON.stringify(rm)); 
console.log('match_array_index: ' + rm.index); 
console.log('match_array_input: ' + rm.input); 
while(re = p.exec(s)){ 
console.log('----------------------------'); 
console.log('exec_array: ' + JSON.stringify(re)); 
console.log('exec_array_index: ' + re.index); 
console.log('exec_array_input: ' + re.input); 
console.log('regexp_lastIndex: ' + p.lastIndex); 
} 
console.log('----------------------------'); 
console.log('exec_array: ' + re); 
console.log('regexp_lastIndex: ' + p.lastIndex);

结果:
match_array: ["this","is"] 
match_array_index: undefined 
match_array_input: undefined 
---------------------------- 
exec_array: ["this","i"] 
exec_array_index: 0 
exec_array_input: this is a string 
regexp_lastIndex: 4 
---------------------------- 
exec_array: ["is","i"] 
exec_array_index: 5 
exec_array_input: this is a string 
regexp_lastIndex: 7 
---------------------------- 
exec_array: null 
regexp_lastIndex: 0

综上:

1.在没有g标识符时,match和exec方法效果是一样的;有g标识符时,exec方法可以提供最完整的匹配结果。
2.这里顺便提一下RegExp.test()方法,它是exec方法的简化版,有匹配结果就返回true,没有匹配结果就返回false,执行过程与exec是一样的。相当于 (p.exec(s) != null)。
3.RegExp的lastIndex属性在有g标识符,且在exec和test方法中是有效的,其他地方是无效的。

Javascript 相关文章推荐
xml 与javascript结合的问题解决方法
Mar 24 Javascript
JQuery打造PHP的AJAX表单提交实例
Nov 03 Javascript
JavaScript Event学习第四章 传统的事件注册模型
Feb 07 Javascript
Bootstrap前端开发案例二
Jun 17 Javascript
JS验证 只能输入小数点,数字,负数的实现方法
Oct 07 Javascript
浅析JavaScript中break、continue和return的区别
Nov 30 Javascript
Vue.js学习之计算属性
Jan 22 Javascript
Bootstrap按钮组简单实现代码
Mar 06 Javascript
微信小程序实战之登录页面制作(5)
Mar 30 Javascript
浅谈如何使用webpack构建多页面应用
May 30 Javascript
微信小程序倒计时功能实例代码
Jul 17 Javascript
vue实现todolist功能、todolist组件拆分及todolist的删除功能
Apr 11 Javascript
防止文件缓存的js代码
Jan 10 #Javascript
js修改table中Td的值(定义td的单击事件)
Jan 10 #Javascript
js修改table中Td的值(定义td的双击事件)
Jan 10 #Javascript
javascript之Partial Application学习
Jan 10 #Javascript
javascript之典型高阶函数应用介绍二
Jan 10 #Javascript
javascript之典型高阶函数应用介绍
Jan 10 #Javascript
根据json字符串生成Html的一种方式
Jan 09 #Javascript
You might like
php中函数前加&符号的作用分解
2014/07/08 PHP
论坛里点击别人帖子下面的回复,回复标题变成“回复 24# 的帖子”
2009/06/14 Javascript
JS获取当前日期时间并定时刷新示例
2021/03/04 Javascript
初步认识JavaScript函数库jQuery
2015/06/18 Javascript
Bootstrap Table使用方法解析
2016/10/19 Javascript
JS实现页面跳转参数不丢失的方法
2016/11/28 Javascript
Angular的$http与$location
2016/12/26 Javascript
Javascript 两种刷新方法以及区别和适用范围
2017/01/17 Javascript
jQuery插件HighCharts绘制2D金字塔图效果示例【附demo源码下载】
2017/03/09 Javascript
彻底学会Angular.js中的transclusion
2017/03/12 Javascript
JavaScript基本语法_动力节点Java学院整理
2017/06/26 Javascript
vue router动态路由下让每个子路由都是独立组件的解决方案
2018/04/24 Javascript
vue之将echart封装为组件
2018/06/02 Javascript
vue组件实现进度条效果
2018/06/06 Javascript
微信小程序 网络通信实现详解
2019/07/23 Javascript
vue使用video插件vue-video-player详解
2020/10/23 Javascript
解决谷歌搜索技术文章时打不开网页问题的python脚本
2013/02/10 Python
python使用Berkeley DB数据库实例
2014/09/26 Python
python定时检查某个进程是否已经关闭的方法
2015/05/20 Python
简单了解Python下用于监视文件系统的pyinotify包
2015/11/13 Python
python列表生成式与列表生成器的使用
2018/02/23 Python
Python中请不要再用re.compile了
2019/06/30 Python
关于Pytorch的MLP模块实现方式
2020/01/07 Python
tensorflow 固定部分参数训练,只训练部分参数的实例
2020/01/20 Python
pycharm 对代码做静态检查操作
2020/06/09 Python
使用 prometheus python 库编写自定义指标的方法(完整代码)
2020/06/29 Python
Keras实现DenseNet结构操作
2020/07/06 Python
Algenist奥杰尼官网:微藻抗衰老护肤品牌
2017/07/15 全球购物
德国二手设计师时装和复古时装跳蚤市场:Mädchenflohmarkt
2020/11/09 全球购物
工商管理专业职业生涯规划
2014/01/01 职场文书
应届生简历中的自我评价
2014/01/13 职场文书
教师个人查摆剖析材料
2014/10/14 职场文书
地方课程教学计划
2015/01/19 职场文书
2015年幼儿园大班工作总结
2015/04/25 职场文书
纯CSS实现酷炫的霓虹灯效果
2021/04/13 HTML / CSS
Vue组件更新数据v-model不生效的解决
2022/04/02 Vue.js