深度解析正则表达式exec和match两者使用的异同以及要注意的地方
1.match
match方法属于String正则表达方法.
语法: str.match(regexp)
str:要进行匹配的字符串. regexp:一个正则表达式(或者由RegExp()构造成的正则表达式)
match的用法主要区分就是,正则表达式是否有全局标示g.
(1)如果有g全局标志,那么返回的数组保存的是,所有匹配的内容,不包过子匹配。
(2))如果没有g全局标志,那么返回的数组arr.arr[0]保存的是完整的匹配.arr[1]保存的是第一个括号里捕获的字串,依此类推arr[n]保存的是第n个括号捕获的内容.也就是当包含有全局的标志时则返回的结果第一个是正确匹配的结果,后面依次是子匹配的结果。
string的其他几个与正则有关的方法:
(1)search:str.search(reg);查找指定字符在字符串中的位置
(2)replace:str.replace(reg,replaceStr);将匹配的字符用后面的替换,第二个参数可以传递为function,其返回值将替换指定的字符
2.exec
与match方法不同exec属于正则表达式对象的方法.
语法:var result1 = regexp.exec(str);
regexp:正则表达式(可以直接定义也可以利用RegExp的方式定义) str:要匹配的字串
exec与match的关联就是exec(g有没有都无影响)就等价于不含有g全局标志的match.即返回数组arr[0]为匹配的完整串.其余的为括号里捕获的字符串(当含有子匹配时).
(1)、如果exec执行的正则表达式没有子表达式(小括号内的内容,如/abc(\s*)/中的(\s*) ),如果有匹配,就返回第一个匹配的字符串内容,此时的类数组中的第一个元素为匹配的内容,(类数组中还包含有index:匹配字符串在原始字符串中的位置,input:输入的字符串)如果没有匹配返回null;
var reg = new RegExp("abc") ;
var str = "3abc4,5abc6";
alert(reg.exec(str));
alert(str.match(reg));
执行如上代码,你会发现两者内容均为一样:abc,此时exec 中没有子表达式同时两者均为非全局的匹配
********子表达式捕获的内容就是指的第一个完全匹配的字符串中在表达式匹配的部分:
var a=/^([^.]*)(?:\.(.+)|)$/;
var str="click.41646ass.sss";
var b=a.exec(str); console.log(b)
输出["click.41646ass.sss", "click",
"41646ass.sss"],正则表达式中共有三个括号但是第二个大括号采用?:的方法取消了捕获,也就是不输出匹配字符串中该子表达式匹配的部分,click对应([^.]*),41646ass.sss对应(.+),所以当为a=/^([^.]*)(\.(.+)|)$/时输出的结果为:["click.41646ass.sss",
"click",".41646ass.sss" ,"41646ass.sss"],.41646ass.sss对应于(?:\.(.+)|)
(2)、当exec和match中具有相同的子表达式且为非全局匹配时两者的输出也是相同的,同时输出的数组中含有的多个元素。
var
str="visit W3cschool a W3cschool
bull";
var reg=new
RegExp("W3c(school)");
var b=reg.exec(str);
console.log(b);
console.log(str.match(/W3c(school)/));
执行上诉代码的结果为W3cschool,school
(3)、当为全局匹配时
var
str="visit W3cschool a W3cschool bull";
var reg=new
RegExp("W3cschool",'g');
var b=reg.exec(str);
console.log(b);
console.log(str.match(/W3cschool/g));
Exec中没有子表达式其输出为W3cschool,其输出只一个,match全局匹配时其输出元素中将包含所有的匹配项,其输出为W3cshcool,W3cschool
正则表达式对象中的test方法:
regExp.test(str),当有匹配项时则返回true,否则返回false.当只需要判断字符中是否有匹配项时,利用该方法比较快捷。
总结为:
(1)exec中不管是不是全局的匹配,只要没有子表达式,其返回的都只有一个元素,如果是全局匹配,可以利用lastIndex进行下一个匹配,匹配成功后lastIndex的值将会变为上次匹配的字符的最后一个位置的索引。在设置g属性后,虽然匹配结果不受g的影响,返回结果仍然是一个数组(第一个值是第一个匹配到的字符串,以后的为分组匹配内容),但是会改变index和 lastIndex等的值,将该对象的匹配的开始位置设置到紧接这匹配子串的字符位置,当第二次调用exec时,将从lastIndex所指示的字符位置
开始检索。同样match方法在设置了g属性后,也会改变index和lastIndex的值,但是是一次性的。无法像exec那样能逐过程累积,因此无
法累积获取下一次检索的位置。
var
patt = new RegExp('ab', 'g');
var
str = 'abcdef12ab34cd56ef';
var
ret;
while((ret =
patt.exec(str))!=null) {
document.write(ret+"</br>");
document.write("ret.input="+ret.input+"</br>");
document.write("ret.index="+ret.index+"</br>");
document.write("RegExp.lastIndex ="+patt.lastIndex
+"</br>");
}
注意:当没有全局的变量g时,由于index和lastindex的值不会变化(除非手动修改),则会导致每次的陪匹配都是从字符串的头开始的,所以只要字符串中有匹配,就会导致死循环,当时设置g后,会自动改变前面的两个属性,会依次向后匹配直到没有匹配项退出循环
输出结果:
ab
ret.input=abcdef12ab34cd56ef
ret.index=0
RegExp.lastIndex =2
ab
ret.input=abcdef12ab34cd56ef
ret.index=8
RegExp.lastIndex =10
(2)Match在非全局匹配时其他几种情况下(有无子匹配的情况下)的返回结果和exec是相同的,在全局匹配时其将返回包含所有匹配项的数组(其中不包含子匹配)。
(3)exec返回的是类数组而match返回的则是数组
深度解析正则表达式exec和match两者使用的异同以及要注意的地方的更多相关文章
- js 正则表达式 exec 和 match的使用
match body.match(/\d\.\d\.\d\.\d:\d/g); // 推荐使用exec可以拿到多个数组 exec var a = [ 'PHPSESSID=sglvjui97o18bg ...
- 正则表达式中的exec和match方法的区别
正则表达式中的exec和match方法的区别 字符串的正则方法有:match().replace().search().split() 正则对象的方法有:exec().test() 1.match m ...
- [WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析
[WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析 标签: webkit内核JavaScriptCore 2015-03-26 23:26 2285 ...
- 第37课 深度解析QMap与QHash
1. QMap深度解析 (1)QMap是一个以升序键顺序存储键值对的数据结构 ①QMap原型为 class QMap<K, T>模板 ②QMap中的键值对根据Key进行了排序 ③QMap中 ...
- JavaScript——exec和match
题目17:Read the following javascript code: var someText="web2.0 .net2.0";var pattern=/(\w+)( ...
- SpringMVC 源码深度解析<context:component-scan>(扫描和注冊的注解Bean)
我们在SpringMVC开发项目中,有的用注解和XML配置Bean,这两种都各有自己的优势,数据源配置比較经经常使用XML配置.控制层依赖的service比較经经常使用注解等(在部署时比較不会改变的) ...
- test、exec、match区别
test.exec.match的简单区别 1.test test 返回 Boolean,查找对应的字符串中是否存在模式. var str = "1a1b1c"; var reg = ...
- 快速记忆JavaScript中exec和match的使用
JS模式匹配中exec,match用得非常多,所以掌握其用法对我们进行字符串的处理帮助非常大 1.exec的定义其用法 exec与match主要的不同是,exec是正则表达式里面的方法. ...
- js正则表达test、exec和match的区别
test的用法和exec一致,只不过返回值是 true false. 以前用js很少用到js的正则表达式,即使用到了,也是诸如邮件名称之类的判断,网上代码很多,很少有研究,拿来即用. 最近开发遇到一些 ...
随机推荐
- C#通过事件跨类调用WPF主窗口中的控件
xaml.cs文件: using System; using System.Timers; using System.Windows; using System.Windows.Forms; name ...
- vue 中判断页面滑动方向
- PHP 链接数据库1(连接数据库&简单的登录注册)
对 解析变量的理解 数据库的名称和表的名称不能重复 从结果中取出的数据 都是以数组的形式取出的 1.PHP查询数据库中的某条信息 //PHP链接数据库 /*1.造链接对象 IP地址 用户名 密码 ...
- NSLOOKUP命令使用
nslooup命令,可以用来检测dns服务器是否可用,以及域名对应的真实ip,在一些网络dns不稳定的情况下可以使用,用来正确访问网站. Microsoft Windows [版本 6.1.7601] ...
- (转)Tomcat7+Redis存储Session
原创http://blog.csdn.net/caiwenfeng_for_23/article/details/45666831 PS:截止到2015-05-12前是不支持Tomcat8的,详情见官 ...
- 解析 Linux 内核可装载模块的版本检查机制
转自:http://www.ibm.com/developerworks/cn/linux/l-cn-kernelmodules/ 为保持 Linux 内核的稳定与可持续发展,内核在发展过程中引进了可 ...
- 【转】一台电脑同时运行多个tomcat配置方法
参考:http://blog.csdn.net/zyk906705975/article/details/8471475
- ASP.Net 在Update Panel局部刷新后 重新绑定JS方法
我们知道Asp.Net中的Update Panel可以完成页面的局部刷新(实质上是Ajax),但是局部刷新完后,此区域的控件上所绑定的JS方法就会失效,因为我们用如下方法来重新绑定. var prm ...
- Ubuntu菜鸟入门(二)—— apt认知,且完善语言安装包
一 语言安装包安装 1 原因 虽然安装的中文版,但是由于安装包很小,所以汉化的不够完全,所以要安装后,再下载语言包进行安装 2 方法 二 apt--软件包管理器 1 软件源 (1) 介绍 ...
- Hadoop学习笔记(1) 初识Hadoop
1. Hadoop提供了一个可靠的共享存储和分析系统.HDFS实现存储,而MapReduce实现分析处理,这两部分是Hadoop的核心. 2. MapReduce是一个批量查询处理器,并且它能够在合理 ...