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 相关文章推荐
js中的值类型和引用类型小结 文字说明与实例
Dec 12 Javascript
捕获键盘事件(且兼容各浏览器)
Jul 03 Javascript
jQuery拖拽 & 弹出层 介绍与示例
Dec 27 Javascript
jQuery照片伸缩效果不影响其他元素的布局
May 09 Javascript
JavaScript简单表格编辑功能实现方法
Apr 16 Javascript
浅谈DOCTYPE对$(window).height()取值的影响
Jul 21 Javascript
JavaScript编写一个贪吃蛇游戏
Mar 09 Javascript
Bootstrap笔记—折叠实例代码
Mar 13 Javascript
基于Vue实现页面切换左右滑动效果
Jun 29 Javascript
微信小程序 数据缓存实现方法详解
Aug 26 Javascript
vux-scroller实现移动端上拉加载功能过程解析
Oct 08 Javascript
JavaScript实现HSL拾色器
May 21 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
在WIN98下以apache模块方式安装php
2006/10/09 PHP
PHP多线程抓取网页实现代码
2010/07/22 PHP
php中常用的预定义变量小结
2012/05/09 PHP
如何使用php判断所处服务器操作系统的类型
2013/06/20 PHP
PHP中十六进制颜色与RGB颜色值互转的方法
2019/03/18 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
2020/03/24 PHP
新发现一个骗链接的方法(js读取cookies)
2012/01/11 Javascript
jQuery中map()方法用法实例
2015/01/06 Javascript
JavaScript中定义函数的三种方法
2015/03/12 Javascript
JavaScript简单下拉菜单实例代码
2015/09/07 Javascript
js+css实现回到顶部按钮(back to top)
2016/03/02 Javascript
利用jsonp跨域调用百度js实现搜索框智能提示
2016/08/24 Javascript
微信小程序 二维码canvas绘制实例详解
2017/01/06 Javascript
Vue.js实现一个SPA登录页面的过程【推荐】
2017/04/29 Javascript
一次围绕setTimeout的前端面试经验分享
2017/06/15 Javascript
AngularJS实现的select二级联动下拉菜单功能示例
2017/10/25 Javascript
vue-cli3全面配置详解
2018/11/14 Javascript
Vue+webpack实现懒加载过程解析
2020/02/17 Javascript
基于JS实现视频上传显示进度条
2020/05/12 Javascript
浅谈vue中resetFields()使用注意事项
2020/08/12 Javascript
[54:33]2018DOTA2亚洲邀请赛小组赛 A组加赛 Liquid vs Optic
2018/04/03 DOTA
用python实现面向对像的ASP程序实例
2014/11/10 Python
Python中用pycurl监控http响应时间脚本分享
2015/02/02 Python
利用Python脚本在Nginx和uwsgi上部署MoinMoin的教程
2015/05/05 Python
python3.6使用urllib完成下载的实例
2018/12/19 Python
Python对接六大主流数据库(只需三步)
2019/07/31 Python
wxpython布局的实现方法
2019/11/01 Python
LODI女鞋在线商店:阿利坎特的鞋类品牌
2019/02/15 全球购物
介绍一下XMLHttpRequest对象的常用方法和属性
2013/05/24 面试题
宿舍违规检讨书
2014/01/12 职场文书
求职信的最佳写作思路
2014/02/01 职场文书
年终晚会活动方案
2014/08/21 职场文书
民间个人借款协议书
2014/09/30 职场文书
门店店长岗位职责
2015/04/14 职场文书
2016年党员承诺书范文
2016/03/24 职场文书
导游词之黄帝陵景区
2019/09/16 职场文书