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 获取浏览器高度和宽度值(多浏览器)
Sep 02 Javascript
javascript 获取iframe里页面中元素值的方法
Feb 17 Javascript
jQuery的$.proxy()应用示例介绍
Apr 03 Javascript
在Linux系统中搭建Node.js开发环境的简单步骤讲解
Jan 26 Javascript
jQuery遍历DOM节点操作之filter()方法详解
Apr 14 Javascript
jQuery利用sort对DOM元素进行排序操作
Nov 07 Javascript
jQuery.parseHTML() 函数详解
Jan 09 Javascript
基于AGS JS开发自定义贴图图层
Mar 31 Javascript
解决jquery appaend元素中id绑定事件失效的问题
Sep 12 jQuery
详谈Object.defineProperty 及实现数据双向绑定
Jul 18 Javascript
React实现阿里云OSS上传文件的示例
Aug 10 Javascript
Openlayers实现地图全屏显示
Sep 28 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面向对象之标识对象
2017/06/27 PHP
获取DOM对象的几种扩展及简写
2006/10/09 Javascript
Three.js源码阅读笔记(物体是如何组织的)
2012/12/27 Javascript
判定是否原生方法的JS代码
2013/11/12 Javascript
jQuery实现列表自动滚动循环滚动展示新闻
2014/08/22 Javascript
jquery ui bootstrap 实现自定义风格
2014/11/14 Javascript
JQuery实现动态适时改变字体颜色的方法
2015/03/10 Javascript
jQuery Ajax调用WCF服务详细教程
2015/03/31 Javascript
JavaScript实现图片轮播的方法
2015/07/31 Javascript
Jquery常用的方法汇总
2015/09/01 Javascript
js实现的奥运倒计时时钟效果代码
2015/12/09 Javascript
JS常见问题之为什么点击弹出的i总是最后一个
2016/01/05 Javascript
微信小程序图片自适应支持多图实例详解
2017/06/21 Javascript
微信小程序获取微信运动步数的实例代码
2017/07/20 Javascript
Node.js 使用AngularJS的方法示例
2018/05/11 Javascript
优雅的在React项目中使用Redux的方法
2018/11/10 Javascript
在Vue项目中使用snapshot测试的具体使用
2019/04/16 Javascript
通过图带你深入了解vue的响应式原理
2019/06/21 Javascript
js实现轮播图效果 纯js实现图片自动切换
2020/08/09 Javascript
Vue 修改网站图标的方法
2020/12/31 Vue.js
[00:09]DOTA2新版本PA至宝特效动作展示
2014/11/19 DOTA
Python中除法使用的注意事项
2014/08/21 Python
python retrying模块的使用方法详解
2019/09/25 Python
python3 mmh3安装及使用方法
2019/10/09 Python
Python银行系统实战源码
2019/10/25 Python
Python图像处理库PIL的ImageGrab模块介绍详解
2020/02/26 Python
关于PySnooper 永远不要使用print进行调试的问题
2021/03/04 Python
英国领先的汽车轮胎和快速健康中心:Kwik Fit
2017/10/29 全球购物
西班牙三叶草药房:Farmacias Trébol
2019/05/03 全球购物
Jones Bootmaker官网:优质靴子和鞋子在线
2020/11/30 全球购物
什么是smarty? Smarty的优点是什么?
2013/08/11 面试题
白酒业务员岗位职责
2013/12/27 职场文书
公安领导班子四风问题个人整改措施思想汇报
2014/10/09 职场文书
公司2015年终工作总结
2015/05/26 职场文书
新党员入党决心书
2015/09/22 职场文书
go语言基础 seek光标位置os包的使用
2021/05/09 Golang