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 相关文章推荐
极酷的javascirpt,让你随意编辑任何网页
Feb 25 Javascript
Javascript 同时提交多个Web表单的方法
Feb 19 Javascript
Jquery 1.42 checkbox 全选和反选代码
Mar 27 Javascript
javascript中length属性的探索
Jul 31 Javascript
解决checkbox的attr(checked)一直为undefined问题
Jun 16 Javascript
JavaScript中string转换成number介绍
Dec 31 Javascript
基于JavaScript实现智能右键菜单
Mar 02 Javascript
Javascript基础_标记文字的实现方法
Jun 14 Javascript
javascript使用递归算法求两个数字组合功能示例
Jan 03 Javascript
详谈js中window.location.search的用法和作用
Feb 13 Javascript
vue.js开发环境安装教程
Mar 17 Javascript
Javascript模块化机制实现原理详解
Apr 02 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
IIS+PHP+MySQL+Zend配置 (视频教程)
2006/12/13 PHP
PHP 作用域解析运算符(::)
2010/07/27 PHP
php array_intersect比array_diff快(附详细的使用说明)
2011/07/03 PHP
php中的路径问题与set_include_path使用介绍
2014/02/11 PHP
ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例
2014/07/22 PHP
php中mkdir函数用法实例分析
2014/11/15 PHP
Zend Framework教程之Zend_Layout布局助手详解
2016/03/04 PHP
php封装的数据库函数与用法示例【参考thinkPHP】
2016/11/08 PHP
php删除二维数组中的重复值方法
2018/03/12 PHP
js下用gb2312编码解码实现方法
2009/12/31 Javascript
一些mootools的学习资源
2010/02/07 Javascript
jQuery 选择器、DOM操作、事件、动画
2010/11/25 Javascript
jquery datepicker参数介绍和示例
2014/04/15 Javascript
JS定义网页表单提交(submit)的方法
2015/03/20 Javascript
JavaScript转换二进制编码为ASCII码的方法
2015/04/16 Javascript
RequireJS简易绘图程序开发
2016/10/28 Javascript
详解Vue中添加过渡效果
2017/03/20 Javascript
详解Vue组件之间通信的七种方式
2019/04/14 Javascript
[01:45]DOTA2新英雄“神谕者”全方位展示
2014/11/21 DOTA
Python基础教程之浅拷贝和深拷贝实例详解
2017/07/15 Python
python模块smtplib学习
2018/05/22 Python
python面向对象入门教程之从代码复用开始(一)
2018/12/11 Python
Pytest mark使用实例及原理解析
2020/02/22 Python
python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例
2020/02/28 Python
python matplotlib.pyplot.plot()参数用法
2020/04/14 Python
Python try except异常捕获机制原理解析
2020/04/18 Python
python3 googletrans超时报错问题及翻译工具优化方案 附源码
2020/12/23 Python
matplotlib源码解析标题实现(窗口标题,标题,子图标题不同之间的差异)
2021/02/22 Python
博士生入学考试推荐信
2013/11/17 职场文书
施工资料员岗位职责
2014/01/06 职场文书
中介业务员岗位职责
2014/04/09 职场文书
2015年学生会主席工作总结
2015/04/21 职场文书
2016年党员读书月活动总结
2016/04/06 职场文书
提升Nginx性能的一些建议
2021/03/31 Servers
利用JuiceFS使MySQL 备份验证性能提升 10 倍
2022/03/17 MySQL
vue ant design 封装弹窗表单的使用
2022/06/01 Vue.js