JavaScript 学习笔记(十四) 正则表达式


Posted in Javascript onJanuary 22, 2010

RegExp类
RegExp对象的构造函数可以带一个或两个参数
第一个参数是描述需要进行匹配的模式字符串,如果还有第二个参数,这个参数则制定了额外的处理指令。
一、基础
1.1使用RegExp对象
test()方法
测试是否匹配。如果给定字符串(只有一个参数)匹配这个模式,它就返回true,否则返回false

var sToMatch = "cat"; 
var reCat = /cat/; //正则表达式字面量使用Perl风格的语法 
alert(reCat.test(sToMatch)); //outs "true"

exec()方法
有一个字符串参数,返回一个数组。数组中的第一个条目是第一个匹配,其他的是反向引用。(即数组中只有一个,并且是第一个匹配的)
var strAAA = "a bat, a Cat, a fAt baT, a faT cat"; 
var regAt = new RegExp("at", "gi"); 
var arr = regAt.exec(strAAA); //arr[0]为"at",arr.index值为3,arr.lastIndex值为5 
match()方法

返回一个包含在字符串中的所有匹配的数组。
var strAAA = "a bat, a Cat, a fAt baT, a faT cat";
var regAt = new RegExp("at", "gi");
var arrMatch = strAAA.match(regAt); //注意:字符串.match(参数是匹配字符)跟上面相反
search()方法
与indexOf()有些类似,返回在字符串中出现的一个匹配的位置。它的参数是一个RegExp对象而非仅仅一个子字符串。
var strAAA = "a bat, a Cat, a fAt baT, a faT cat"; 
var regAt = new RegExp("at", "gi"); 
var index = strAAA.search(regAt); //outputs "3" 第一次出现位置是3

1.2扩展字符串方法
replace()方法
可以用第二个参数替换第一个参数,而在这里第一个参数也可以是一个正则表达式。
var strBBB = "The Sky is red.";
//将上面这句话中的所有s替换,用正则表达式找出所有匹配的
var strNewBBB = strBBB.replace(/s/gi, "##"); //把所有的“s”(不管大小写)都替换成##
再进行升级一下,第二个参数也可以是一个函数
var sToChange = "The sky is red."; 
var reRed = /red/; 
var sResultText = sToChange.replace(reRed, function(sMatch) { 
return "blue"; 
}); 
alert(sResultText);

在这个例子中,在函数中的sMatch的值总为"red" (因为这是唯一匹配的模式)."red"的首次出现被替换为函数的返回值"blue".
附加:
对于书上这句话“因为这是唯一匹配的模式”我认为应该是这个意思吧,replace只有两个参数,第一个参数找出来的是唯一的,那个function的参数sMatch应该就是前面的第一个参数的值,唯一匹配模式。。。
split()方法
var sColor = "red,blue,yellow,green"; 
var reComma = /\,/; 
var arrColors = sColor.split(reComma); //split at each comma 
alert(arrColors.length); //outputs "4"

正则表达式reComma中必须在逗号前有一个反斜杠,因为逗号在语法中有特殊含义,必须经过转义。
二、简单模式
2.1元字符
正则表达式用到的所有元字符有:
( [ { \ ^ $ | ) ? * + .
一共12个。在任何时候要用到这些元字符的时候就需要转义,也就是在前面加上反斜杠。
例:
var reQMark = /\?/; //转义
var reQMark=new RegExp("\\?"); //这里需要注意,双重转义,因为本身反斜杠也是需要转义
所以我们以后应该尽量使用第一种情况,字面量语法!Perl的风格
2.2使用特殊字符
另外,还有其他一些预定义的特殊字符,如下表所列:
字符 描述
----------------------------------------------------
\t 制表符
\n 换行符
\r 回车符
\f 换页符
\a alert字符
\e escape字符
\cX 与X相对应的控制字符
\b 回退字符
\v 垂直制表符
\0 空字符
----------------------------------------------------
2.3字符类
将一些字符放入方括号中,可以很有效的告诉正则表达式去匹配第一个、第二个、第三个字符等等。
//①字符类----简单类
var sToMatch = "a bat,a Cat,a fAt baT,a faT cat";
//匹配以bat或cat或fat的正则表达式
var reBatCatFat = /[bcf]at/gi;
//var reBatCatRat=/[\u0062cf]at/gi; 使用Unicode形式
var arrMatches = sToMatch.match(reBatCatRat);
alert(arrMatches.join(",")); //输出"bat,Cat,fAt,baT,faT,cat"
//②字符类----负向类
var sToMatch = "a bat,a Cat,a fAt baT,a faT cat";
//匹配以at结尾,但是不以b或c开头的正则表达式
var reBatCatRat = /[^bc]at/gi; //脱字符^表示不能匹配后面跟着的字符
var arrMatches = sToMatch.match(reBatCatRat);
alert(arrMatches.join(",")); //输出 "fAt,faT"
//③字符类----范围类
//指定从a到z之间的范围:[a-z]. 这里是区分大小写的
var sToMatch = "num1,num2,num3,num4,num5,num6,num7,num8,num9";
var reOneToFour = /num[1-4]/gi; //从1到4
var arrMatches = sToMatch.match(reOneToFour);
alert(arrMatches.join(",")); //输出 "num1,num2,num3,num4"
//④字符类----组合类
组合类(combination class)是由几种其他的类组合而成的字符类.
假如要匹配所有的从a-m的字母以及从1-4的数字,以及一个换行符,那么所用到的类应该是这样:
[a-m1-4\n]
注意在内部的类之间不要有空格.
//⑤字符类----预定义类
代码 等同于 匹配
----------------------------------------------------------------
. [^\n\r] 除了换行和回车之外的任意字符
\d [0-9] 数字
\D [^0-9] 非数字字符
\s [ \t\n\x0B\f\r] 空白字符
\S [^ \t\n\x0B\f\r] 非空白字符
\w [a-zA-Z_0-9] 单词字符(所有的字符、数字和下划线)
\W [^a-zA-Z_0-9] 非单词字符
-----------------------------------------------------------------
使用预定义字符可以明显地使模式匹配变得简单。例如,假设想匹配3个数字:
var sToMatch = "567 9838 abc";
var reThreeNums = /[0-9][0-9][0-9]/;
//var reThreeNums=/\d\d\d/; //用预定义比较简洁
alert(reThreeNums.test(sToMatch)); //输出 "true"
2.4量词
量词(quantifier)可以指定某个特定模式出现的次数。当指定某个模式应当出现的次数时,可以指定硬性数量,也可以指定软性数量。
1.简单量词
--------------------------------------------------------------------
代码 描述
--------------------------------------------------------------------
? 出现零次或一次
* 出现零次或多次(任意次)
+ 出现一次或多次(至少出现一次)
{n} 一定出现n次
{n,m} 至少出现n次但不超过m次
{n,} 至少出现n次
--------------------------------------------------------------------
例如,假设想匹配单词bread,read或red.使用问号量词,则可以只要使用一个表达式就可以匹配这三个:
var reBreadReadOrRed = /b?rea?d/;
或者var reBreadReadOrRed = /b{0,1}rea{0,1}d/;
2.贪婪的、惰性的和支配性的量词
贪婪量词先看整个的字符串是否匹配。如果没有发现匹配,它去掉该字符串中的最后一个字符,并再次尝试。如果还是没有发现匹配,那么再次去掉最后一个字符,这个过程会一直重复直至到发现一个匹配或者字符串不剩任何字符。
懒性量词先看字符串中的第一个字母是否匹配。如果单独这个字符还不够,就读入下一个字符,组成两个字符的字符串。如果还是没有发现匹配,惰性量词继续从字符串中添加字符直到发现匹配或者整个字符串都检查过也没有匹配。惰性量词和贪婪量词的工作方式恰好相反。
支配量词只尝试匹配整个字符串。如果整个字符串不能产生匹配,不做进一步尝试。支配量词其实简单的说,就是一刀切。
--------------------------------------------------------------------
贪婪 惰性 支配 描述
--------------------------------------------------------------------
? ?? ?+ 零次或一次出现
* *? *+ 零次或多次出现
+ +? ++ 一次或多次出现
{n} {n}? {n}+ 恰好n次出现
{n,m} {n,m}? {n,m}+ 至少n次至多m次出现
{n,} {n,}? {n,}+ 至少n次出现
--------------------------------------------------------------------
看下面例子更好的理解以上三种量词
var str = "abbbaabbbaaabbb1234";
var reg1 = /.*bbb/g;
var reg2 = /.*?bbb/g;
//var reg3 = /.*+bbb/g; //在Visual Studio2008里报错.....
var arrMatches1 = str.match(reg1);
var arrMatches2 = str.match(reg2);
//var arrMatches3 = str.match(reg3);
alert("贪婪的:" + arrMatches1.join(",") + "\n惰性的:" + arrMatches2.join(","));
主要是匹配的一个过程不同!
Javascript 相关文章推荐
javascript 读取xml,写入xml 实现代码
Jul 10 Javascript
缓动函数requestAnimationFrame 更好的实现浏览器经动画
Dec 07 Javascript
去掉gridPanel表头全选框的小例子
Jul 18 Javascript
jQuery简单tab切换效果实现方法
Apr 08 Javascript
AngularJS实践之使用NgModelController进行数据绑定
Oct 08 Javascript
zTree树形插件异步加载方法详解
Jun 14 Javascript
Vue2.0如何发布项目实战
Jul 27 Javascript
vue修改对象的属性值后页面不重新渲染的实例
Aug 09 Javascript
微信小程序网络层封装的实现(promise, 登录锁)
May 08 Javascript
微信小程序进入广告实现代码实例
Sep 19 Javascript
VUE实现强制渲染,强制更新
Oct 29 Javascript
Vue 3.0中jsx语法的使用
Nov 13 Javascript
JQuery.uploadify 上传文件插件的使用详解 for ASP.NET
Jan 22 #Javascript
JQuery 构建客户/服务分离的链接模型中Table中的排序分析
Jan 22 #Javascript
JQuery 构建客户/服务分离的链接模型中Table分页代码效率初探
Jan 22 #Javascript
被jQuery折腾得半死,揭秘为何jQuery为何在IE/Firefox下均无法使用
Jan 22 #Javascript
jQuery 入门级学习笔记及源码
Jan 22 #Javascript
JQuery 确定css方框模型(盒模型Box Model)
Jan 22 #Javascript
Jquery实战_读书笔记2 选择器
Jan 22 #Javascript
You might like
关于时间计算的结总
2006/12/06 PHP
PHP中使用数组指针函数操作数组示例
2014/11/19 PHP
JS模拟的QQ面板上的多级可展开的菜单
2009/10/10 Javascript
jQuery使用之标记元素属性用法实例
2015/01/19 Javascript
JavaScript中的函数声明和函数表达式区别浅析
2015/03/27 Javascript
js实现兼容IE和FF的上下层的移动
2015/05/04 Javascript
jQuery插件jPaginate实现无刷新分页
2015/05/04 Javascript
jquery通过扩展select控件实现支持enter或focus选择的方法
2015/11/19 Javascript
Atitit.js的键盘按键事件捆绑and事件调度
2016/04/01 Javascript
js实现分页功能
2017/05/24 Javascript
vue.js如何更改默认端口号8080为指定端口的方法
2017/07/14 Javascript
如何让你的JS代码更好看易读
2017/12/01 Javascript
JS实现的抛物线运动效果示例
2018/01/30 Javascript
JavaScript指定断点操作实例教程
2018/09/18 Javascript
JS简易计算器实例讲解
2020/06/30 Javascript
python字符串编码识别模块chardet简单应用
2015/06/15 Python
Python Requests安装与简单运用
2016/04/07 Python
Pycharm导入Python包,模块的图文教程
2018/06/13 Python
使用python根据端口号关闭进程的方法
2018/11/06 Python
Python使用python-docx读写word文档
2019/08/26 Python
Python threading的使用方法解析
2019/08/28 Python
python利用platform模块获取系统信息
2020/10/09 Python
python利用xlsxwriter模块 操作 Excel
2020/10/14 Python
css3 box-shadow阴影(外阴影与外发光)图示讲解
2017/08/11 HTML / CSS
html+css实现自定义图片上传按钮功能
2019/09/04 HTML / CSS
松下电器美国官方商店:Panasonic美国
2016/10/14 全球购物
Everything But Water官网:美国泳装品牌
2019/03/17 全球购物
Linux如何为某个操作添加别名
2013/03/01 面试题
JSF界面控制层技术
2013/06/17 面试题
实习销售业务员自我鉴定
2013/09/21 职场文书
上学迟到的检讨书
2014/01/11 职场文书
党的群众路线对照检查材料(个人)
2014/09/24 职场文书
失职检讨书大全
2015/01/26 职场文书
教师评职称工作总结2015
2015/04/20 职场文书
Python 数据可视化之Seaborn详解
2021/11/02 Python
MySQL数据库如何给表设置约束详解
2022/03/13 MySQL