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 相关文章推荐
js解析与序列化json数据(一)json.stringify()的基本用法
Feb 01 Javascript
javascript针对cookie的基本操作实例详解
Nov 30 Javascript
浅谈bootstrap源码分析之tab(选项卡)
Jun 06 Javascript
JS实现放大、缩小及拖拽图片的方法【可兼容IE、火狐】
Aug 23 Javascript
JavaScript中关于for循环删除数组元素内容时出现的问题
Nov 21 Javascript
ES6中的rest参数与扩展运算符详解
Jul 18 Javascript
Sublime Text新建.vue模板并高亮(图文教程)
Oct 26 Javascript
使用DataTable插件实现异步加载数据
Nov 19 Javascript
微信小程序自定义toast实现方法详解【附demo源码下载】
Nov 28 Javascript
通过 JS 判断页面是否有滚动条的实现方法
Apr 05 Javascript
vue组件传值的实现方式小结【三种方式】
Feb 05 Javascript
Promise静态四兄弟实现示例详解
Jul 07 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的优点与缺点
2013/04/11 PHP
使用PHP Socket写的POP3类
2013/10/30 PHP
PHP符合PSR编程规范的实例分享
2016/12/21 PHP
在云虚拟主机部署thinkphp5项目的步骤详解
2017/12/21 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
2017/12/25 PHP
PHP获取对象属性的三种方法实例分析
2019/01/03 PHP
一些技巧性实用js代码小结
2009/10/14 Javascript
再论Javascript的类继承
2011/03/05 Javascript
浅谈Javascript 执行顺序
2013/12/18 Javascript
JS实现点击文字对应DIV层不停闪动效果的方法
2015/03/02 Javascript
javascript实现列表滚动的方法
2015/07/30 Javascript
WordPress中利用AJAX异步获取评论用户头像的方法
2016/01/08 Javascript
JS获取checkbox的个数简单实例
2016/08/19 Javascript
基于JS实现类似支付宝支付密码输入框
2016/09/02 Javascript
jquery 判断是否支持Placeholder属性的方法
2017/02/07 Javascript
详解angularjs实现echart图表效果最简洁教程
2017/11/29 Javascript
JS中常用的消息框总结
2018/02/24 Javascript
JS使用正则表达式获取小括号、中括号及花括号内容的方法示例
2018/06/01 Javascript
15个顶级开源JavaScript框架和库
2018/10/10 Javascript
在Python的一段程序中如何使用多次事件循环详解
2017/09/07 Python
Python读取文件内容的三种常用方式及效率比较
2017/10/07 Python
Python文件打开方式实例详解【a、a+、r+、w+区别】
2019/03/30 Python
Django中如何防范CSRF跨站点请求伪造攻击的实现
2019/04/28 Python
Python代码太长换行的实现
2019/07/05 Python
基于TensorFlow中自定义梯度的2种方式
2020/02/04 Python
Python-opencv实现红绿两色识别操作
2020/06/04 Python
Keras 实现加载预训练模型并冻结网络的层
2020/06/15 Python
匡威俄罗斯官网:Converse俄罗斯
2020/05/09 全球购物
大学生求职简历的自我评价范文
2013/10/12 职场文书
单身联谊活动方案
2014/01/29 职场文书
读后感作文评语
2014/12/25 职场文书
考研复习计划
2015/01/19 职场文书
保护动物的宣传语
2015/07/13 职场文书
js 数组 fill() 填充方法
2021/11/02 Javascript
nginx中封禁ip和允许内网ip访问的实现示例
2022/03/17 Servers
spring boot实现文件上传
2022/08/14 Java/Android