当前位置: 首页 > news >正文

js正则表达test、exec和match的区别

test的用法和exec一致,只不过返回值是 true false。

以前用js很少用到js的正则表达式,即使用到了,也是诸如邮件名称之类的判断,网上代码很多,很少有研究,拿来即用。


最近开发遇到一些需要使用正则表达式,顺便研究一下


正则表达式对象有两个定义方式:: 

1、第一种定义:

new RegExp(pattern, attributes);
如var reg = new RegExp("abc","g") 

 其中pattern为表示表达式内容,如上表示匹配abc

attributes:g,全局匹配,i不区分大小写,m执行多行匹配,用最多的为g和i

2、第二种定义:/pattern/attributes.

如:var reg = /abc/g;


正则表达的规则一些规则在此不再说明,只记录exec和match的区别:

1、exec是正则表达式的方法,而不是字符串的方法,它的参数才是字符串,如下所示:

如上定义 

var reg = new RegExp("abc") ; 

var str = "3abc4,5abc6";

reg.exec(str );  

2、match是字符串执行匹配正则表达式规则的方法,他的参数是正则表达,如

var reg = new RegExp("abc") ; 

var str = "3abc4,5abc6";

str.match(reg);

3、exec和match返回的都是数组;

如果exec执行的正则表达式没有子表达式(小括号内的内容,如/abc(\s*)/中的(\s*) ),如果有匹配,就返回第一个匹配的字符串内容,此时的数组仅有一个元素,如果没有匹配返回null;

var reg = new RegExp("abc") ; 
var str = "3abc4,5abc6";
alert(reg.exec(str));
alert(str.match(reg));

执行如上代码,你会发现两者内容均为一样:abc,

4、如果定义正则表达对象为全局匹配如:

var reg = new RegExp("abc","g") ; 
var str = "3abc4,5abc6";
alert(reg.exec(str));
alert(str.match(reg)); 

则 为abc和abc,abc;因为match执行了全局匹配查询;而exec如果没有子表达式只会找到一个匹配的即返回。

5、当表示中含有子表达式的情况:

var reg = new RegExp("a(bc)") ; 
var str = "3abc4,5abc6";
alert(reg.exec(str));
alert(str.match(reg));

你会发现两者执行的结果都是:abc,bc; 

6、当如果正则表达式对象定义为为全局匹配

var reg = new RegExp("a(bc)","g") ; 
var str = "3abc4,5abc6";
alert(reg.exec(str));
alert(str.match(reg));

则两者返回的结果是abc,bc和abc,abc,

总结为:

1、当正则表达式无子表达式,并且定义为非全局匹配时,exec和match执行的结果是一样,均返回第一个匹配的字符串内容;

2、当正则表达式无子表达式,并且定义为全局匹配时,exec和match执行,做存在多处匹配内容,则match返回的是多个元素数组;

3、当正则表达式有子表示时,并且定义为非全局匹配,exec和match执行的结果是一样如上边的第5种情况;

4、当正则表达式有子表示时,并且定义为全局匹配,exec和match执行的结果不一样,此时match将忽略子表达式,只查找全匹配正则表达式并返回所有内容,如上第6种情况;

也就说,exec与全局是否定义无关系,而match则于全局相关联,当定义为非全局,两者执行结果相同;

相关文章:

  • JavaScript 模块化编程 - Module Pattern
  • grunt搭建自动化的web前端开发环境
  • 系统默认alert弹出框域名title问题
  • 浅谈WEB安全性(前端向)
  • JS在线检测,cookie,子cookie
  • 常用的Javascript设计模式
  • 为什么要在引入的css或js后面加参数详解
  • JavaScript合并两个Json对象
  • JS 实用技巧总结
  • js实现继承的5种方式
  • AngularJS 数据双向绑定揭秘
  • JavaSript模块规范 - AMD与CMD
  • 简单易用Seajs
  • AngularJS双向数据绑定
  • Eclipse构建Maven项目
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • 345-反转字符串中的元音字母
  • CentOS 7 防火墙操作
  • CSS实用技巧
  • leetcode386. Lexicographical Numbers
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • MySQL QA
  • mysql_config not found
  • vue-router 实现分析
  • vue中实现单选
  • Web Storage相关
  • Yeoman_Bower_Grunt
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 从零开始的无人驾驶 1
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 基于遗传算法的优化问题求解
  • 软件开发学习的5大技巧,你知道吗?
  • 使用common-codec进行md5加密
  • 微信小程序--------语音识别(前端自己也能玩)
  • 详解NodeJs流之一
  • 协程
  • 一份游戏开发学习路线
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • 扩展资源服务器解决oauth2 性能瓶颈
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • ( 10 )MySQL中的外键
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (蓝桥杯每日一题)love
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)h264中avc和flv数据的解析
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)人的集合论——移山之道
  • (转)为C# Windows服务添加安装程序