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 相关文章推荐
Javascript 跨域访问解决方案
Feb 14 Javascript
JavaScript游戏之是男人就下100层代码打包
Nov 08 Javascript
Javascript图像处理—为矩阵添加常用方法
Dec 27 Javascript
JavaScript实现基于十进制的四舍五入实例
Jul 17 Javascript
谈谈AngularJs中的隐藏和显示
Dec 09 Javascript
node.js+express制作网页计算器
Jan 17 Javascript
Bootstrap基本样式学习笔记之表单(3)
Dec 07 Javascript
vue接入腾讯防水墙代码
May 07 Javascript
VUE实现移动端列表筛选功能
Aug 23 Javascript
vue之组件内监控$store中定义变量的变化详解
Nov 08 Javascript
使用 Opentype.js 生成字体子集的实例代码详解
May 25 Javascript
Vue中的this.$options.data()和this.$data用法说明
Jul 26 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
phpmyadmin中配置文件现在需要绝密的短语密码的解决方法
2007/02/11 PHP
收藏的PHP常用函数 推荐收藏保存
2010/02/21 PHP
php后门URL的防范
2013/11/12 PHP
php简单实现快速排序的方法
2015/04/04 PHP
php实现异步数据调用的方法
2015/12/24 PHP
PHP检测链接是否存在的代码实例分享
2016/05/06 PHP
Yii框架学习笔记之session与cookie简单操作示例
2019/04/30 PHP
点击广告后才能获得下载地址
2006/10/26 Javascript
JS处理VBArray的函数使用说明
2008/05/11 Javascript
Javascript Throttle & Debounce应用介绍
2013/03/19 Javascript
第四篇Bootstrap网格系统偏移列和嵌套列
2016/06/21 Javascript
深入浅析JavaScript中的scrollTop
2016/07/11 Javascript
浅析Node.js实现HTTP文件下载
2016/08/05 Javascript
很实用的js选项卡切换效果
2016/08/12 Javascript
使用Javascript监控前端相关数据的代码
2016/10/27 Javascript
JavaScript中绑定事件的三种方式及去除绑定
2016/11/05 Javascript
使用vue.js实现checkbox的全选和多个的删除功能
2017/02/17 Javascript
jquery实现静态搜索功能(可输入搜索文字)
2017/03/28 jQuery
ES6新特性之Object的变化分析
2017/03/31 Javascript
Ionic2调用本地SQlite实例
2017/04/22 Javascript
移动端图片上传旋转、压缩问题的方法
2018/10/16 Javascript
vue 实现基础组件的自动化全局注册
2020/12/25 Vue.js
Element-ui upload上传文件限制的解决方法
2021/01/22 Javascript
python文件和目录操作函数小结
2014/07/11 Python
Python3.4 tkinter,PIL图片转换
2018/06/21 Python
python绘制已知点的坐标的直线实例
2019/07/04 Python
利用PyQt中的QThread类实现多线程
2020/02/18 Python
python 实现aes256加密
2020/11/27 Python
Vans(范斯)德国官网:美国南加州的原创极限运动潮牌
2017/05/02 全球购物
孤独星球出版物:Lonely Planet Publications
2018/03/17 全球购物
外贸英语毕业生自荐信
2013/11/14 职场文书
交通文明倡议书
2014/05/16 职场文书
2014年移动公司工作总结
2014/12/08 职场文书
读《解忧杂货店》有感:请相信一切都是最好的安排
2019/11/07 职场文书
python爬虫之selenium库的安装及使用教程
2021/05/23 Python
MySQL8.0无法启动3534的解决方法
2021/06/03 MySQL