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 面向对象之命名空间
May 04 Javascript
纯文字版返回顶端的js代码
Aug 01 Javascript
JS 使用for循环遍历子节点查找元素
Sep 06 Javascript
JavaScript字符串对象charAt方法入门实例(用于取得指定位置的字符)
Oct 17 Javascript
使用JS读取XML文件的方法
Nov 25 Javascript
关于javascript事件响应的基础语法总结(必看篇)
Dec 26 Javascript
self.attachevent is not a function的解决方法
Apr 04 Javascript
关于vue.extend和vue.component的区别浅析
Aug 16 Javascript
Node.js dgram模块实现UDP通信示例代码
Sep 26 Javascript
使用vue + less 实现简单换肤功能的示例
Feb 21 Javascript
react 创建单例组件的方法
Apr 26 Javascript
Bootstrap Table实现定时刷新数据的方法
Aug 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
PHP实现清除wordpress里恶意代码
2015/10/21 PHP
php实现获取农历(阴历)、节日、节气的类与用法示例
2017/11/20 PHP
基于php数组中的索引数组和关联数组详解
2018/03/12 PHP
基于php伪静态的实现方法解析
2020/07/31 PHP
PHP文件操作简单介绍及函数汇总
2020/12/11 PHP
fix-ie5.js扩展在IE5下不能使用的几个方法
2007/08/20 Javascript
JavaScript入门学习书籍推荐
2008/06/12 Javascript
论坛里点击别人帖子下面的回复,回复标题变成“回复 24# 的帖子”
2009/06/14 Javascript
extJs 常用到的增,删,改,查操作代码
2009/12/28 Javascript
用Jquery重写windows.alert方法实现思路
2013/04/03 Javascript
javascript获取下拉列表框当中的文本值示例代码
2013/07/31 Javascript
解决jquery版本冲突的有效方法
2014/09/02 Javascript
通过伪协议解决父页面与iframe页面通信的问题
2015/04/05 Javascript
AngularJS入门之动画
2016/07/27 Javascript
jQuery实现点击某个div打开层,点击其他div关闭层实例分析(阻止冒泡)
2016/11/18 Javascript
原生js轮播(仿慕课网)
2017/02/15 Javascript
详解vue2.0 transition 多个元素嵌套使用过渡
2017/06/19 Javascript
angular.js + require.js构建模块化单页面应用的方法步骤
2017/07/19 Javascript
Vue 实现前端权限控制的示例代码
2019/07/09 Javascript
vue 组件销毁并重置的实现
2020/01/13 Javascript
微信小程序实现拨打电话功能的示例代码
2020/06/28 Javascript
[40:01]OG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
[01:18:35]DOTA2-DPC中国联赛 正赛 Elephant vs LBZS BO3 第一场 1月29日
2021/03/11 DOTA
Python使用装饰器模拟用户登陆验证功能示例
2018/08/24 Python
python图形绘制奥运五环实例讲解
2019/09/14 Python
利用python实现冒泡排序算法实例代码
2019/12/01 Python
Python Gluon参数和模块命名操作教程
2019/12/18 Python
Python类型转换的魔术方法详解
2020/12/23 Python
使用css3和jquery实现可伸缩搜索框
2014/02/12 HTML / CSS
NIHAOMARKET官方海外旗舰店:意大利你好华人超市
2018/01/27 全球购物
航空大学应届生求职信
2013/11/10 职场文书
有关爱国演讲稿
2014/05/07 职场文书
授权委托书样本及填写说明
2014/09/19 职场文书
晋江市委常委班子四风问题整改工作方案
2014/10/26 职场文书
2015年党员干部承诺书
2015/01/21 职场文书
《圆明园的毁灭》教学反思
2016/02/16 职场文书