javascript的正则匹配方法学习


Posted in Javascript onFebruary 24, 2016

javascript中正则匹配有3个方法,match,exec,test。这些方法都跟字符串和RegExp对象有关,但使用场景不一样,容易混淆。match是字符串的一个方法,接收一个RegExp对象做为参数,其他的是RegExp对象的方法,接收一个字符串参数。

var str = 'abcdef12ab34cd56ef';
var patt = new RegExp('ab'); //主意是非全局匹配

var ret_test = patt.test(str);
console.log(ret_test);
var ret_match = str.match(patt);
console.log(ret_match);
var ret_exec = patt.exec(str);
console.log(ret_exec);

1. regExp.test(string)

该方法最简单,在string中找到匹配regExp的字符串则返回true,没找到匹配的字符串则返回false

2. regExp.exec(string)

该方法稍微复杂些。

当regExp没有全局标志时,其返回值为字符串数组:数组的第0号元素为刚匹配到的字符串,如果regExp有子表达式,则数组第1号元素为regExp的第一个子表达式,第2号元素为regExp的第二个字表达式...以此类推。在上例中如果 patt = new RegExp('f(\\d)(\\d)','g');则 ret_exec 将为字符串数组:['f12','1','2']。

当regExp有全局标志(g选项)时,返回值为第一个匹配到的字符串组成的数组,数组的第0号元素为刚匹配到的字符串,如果regExp有子表达式,则数组第1号元素为regExp的第一个子表达式,第2号元素为regExp的第二个字表达式...以此类推。同时主意,regExp对象的一个属性(lastIndex)被改变了,lastIndex被设置为那个字符串最后一个字符所在的位置,其的后面的那个位置(在上例中是lastIndex = 2)。当再次调用 regExp.exec(string)时,搜索范围将从regExp.lastIndex开始搜索。此时返回值仍然是单元素的字符串数组,lastIndex = 10 。我们经常用while循环来遍历字符串中的匹配:

var patt = new RegExp('ab', 'g'),
str = 'abcdef12ab34cd56ef', ret;
while((ret = patt.exec(str))!=null) {
  console.log(ret);
}
//输出
['ab']
['ab']

exec方法返回的不是标准的数组,应该算是一个类数组,因为它还有2个属性:input是输入的字符串,index是当前匹配的字符串第一个字符在input中的位置。

3. string.match(regExp)

该方法比exec简单一些,因为它不用考虑regExp的lastIndex属性。同样,也需要分两种情况(全局匹配与非全局匹配)

当regExp没有全局标志时,返回值与调用exec一样,返回一个数组,数组的第0号元素为刚匹配到的字符串,如果regExp有子表达式,则数组第1号元素为regExp的第一个子表达式,第2号元素为regExp的第二个字表达式...以此类推。主意该数组同时还有2个属性:input是输入的字符串string,index是当前匹配的字符串第一个字符在input中的位置。

当regExp有全局标志(g选项)时,很简单,也符合我们的理解:返回所有匹配到的字符串组成的数组。这是标准数组,没有input属性,也没有index属性。返回值数组中除了匹配到的字符串没有任何其他信息。

从上面的分析看出,如果你只是想判断字符串是否匹配某个正则表达式,就用test方法。如果想一次性取出所有匹配到的字符串,或者只找到第一个匹配的字符串就可以,就用match方法。如果你想多次匹配,而且需要知道每个匹配到的字符串在原始字符串中的位置,或者正则表达式中还有子表达式信息需要关注,就用exec方法。

以上就是javascript正则匹配的多种方法介绍,希望对大家的学习有所帮助。

Javascript 相关文章推荐
使用jQuery.fn自定义jQuery翻页插件
Jan 20 Javascript
关于jquery input textare 事件绑定及用法学习
Apr 03 Javascript
JS自定义功能函数实现动态添加网址参数修改网址参数值
Aug 02 Javascript
javascript中定义私有方法说明(private method)
Jan 27 Javascript
json属性名为什么要双引号(个人猜测)
Jul 31 Javascript
JavaScript严格模式禁用With语句的原因
Oct 20 Javascript
Javascript中判断对象是否为空
Jun 10 Javascript
微信小程序 rpx 尺寸单位详细介绍
Oct 13 Javascript
AngularJS ng-repeat数组有重复值的解决方法
Oct 23 Javascript
bootstrap折叠调用collapse()后data-parent不生效的快速解决办法
Feb 23 Javascript
js实现显示手机号码效果
Mar 09 Javascript
React更新渲染原理深入分析
Dec 24 Javascript
适用于javascript开发者的Processing.js入门教程
Feb 24 #Javascript
JavaScript设计模式经典之命令模式
Feb 24 #Javascript
JavaScript设计模式经典之工厂模式
Feb 24 #Javascript
JavaScript的设计模式经典之建造者模式
Feb 24 #Javascript
JavaScript的设计模式经典之代理模式
Feb 24 #Javascript
jQuery实现验证年龄简单思路
Feb 24 #Javascript
JavaScript实现99乘法表及隔行变色实例代码
Feb 24 #Javascript
You might like
深入理解PHP几个算法:PHP冒泡、PHP二分法、PHP求素数、PHP乘法表
2013/06/06 PHP
用Javascript实现Sleep暂停功能代码
2010/09/03 Javascript
JS对外部文件的加载及对IFRMAME的加载的实现,当加载完成后,指定指向方法(方法回调)
2011/07/04 Javascript
jQuery 瀑布流 绝对定位布局(二)(延迟AJAX加载图片)
2012/05/23 Javascript
JavaScript中提前声明变量或函数例子
2014/11/12 Javascript
在JS方法中返回多个值的方法汇总
2015/05/20 Javascript
使用Javascript监控前端相关数据的代码
2016/10/27 Javascript
JavaScript微信定位功能实现方法
2016/11/29 Javascript
Bootstrap基本样式学习笔记之按钮(4)
2016/12/07 Javascript
Bootstrap学习笔记之进度条、媒体对象实例详解
2017/03/09 Javascript
详解Windows下安装Nodejs步骤
2017/05/18 NodeJs
ui-router中使用ocLazyLoad和resolve的具体方法
2017/10/18 Javascript
小程序实现左滑删除功能
2018/10/30 Javascript
微信小程序 多行文本显示...+显示更多按钮和收起更多按钮功能
2019/09/26 Javascript
vue简单封装axios插件和接口的统一管理操作示例
2020/02/02 Javascript
vue 自定义组件的写法与用法详解
2020/03/04 Javascript
javascript设计模式 ? 访问者模式原理与用法实例分析
2020/04/26 Javascript
详解vue中v-on事件监听指令的基本用法
2020/07/22 Javascript
[02:21]DOTA2英雄基础教程 蝙蝠骑士
2013/12/16 DOTA
Python发送email的3种方法
2015/04/28 Python
Python判断文本中消息重复次数的方法
2016/04/27 Python
Python编程给numpy矩阵添加一列方法示例
2017/12/04 Python
Python实现识别手写数字大纲
2018/01/29 Python
shell命令行,一键创建 python 模板文件脚本方法
2018/03/20 Python
Python使用Pickle模块进行数据保存和读取的讲解
2019/04/09 Python
关于python导入模块import与常见的模块详解
2019/08/28 Python
Python lambda表达式filter、map、reduce函数用法解析
2019/09/11 Python
django-xadmin根据当前登录用户动态设置表单字段默认值方式
2020/03/13 Python
ITK 实现多张图像转成单个nii.gz或mha文件案例
2020/07/01 Python
Python利用Faiss库实现ANN近邻搜索的方法详解
2020/08/03 Python
处理textarea中的换行和空格
2019/12/12 HTML / CSS
荷兰浴室和卫浴网上商店:Badkamerxxl.nl
2020/10/06 全球购物
手机银行营销方案
2014/03/14 职场文书
大学专科自荐信
2014/06/17 职场文书
2014年部门工作总结
2014/11/12 职场文书
启迪人心的励志语录:脾气永远不要大于本事
2020/01/02 职场文书