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 07 Javascript
JSON中双引号的轮回使用过程中一定要小心
Mar 05 Javascript
JS实现的网页倒计时数字时钟效果
Mar 02 Javascript
深入php面向对象、模式与实践
Feb 16 Javascript
JS图片定时翻滚效果实现方法
Jun 21 Javascript
JavaScript cookie详解及简单实例应用
Dec 31 Javascript
用file标签实现多图文件上传预览
Feb 14 Javascript
以BootStrap Tab为例写一个前端组件
Jul 25 Javascript
web前端vue实现插值文本和输出原始html
Jan 19 Javascript
jQuery轮播图实例详解
Aug 15 jQuery
H5+C3+JS实现双人对战五子棋游戏(UI篇)
May 28 Javascript
Vue+Spring Boot简单用户登录(附Demo)
Nov 12 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
全国FM电台频率大全 - 13 福建省
2020/03/11 无线电
PHP 高手之路(二)
2006/10/09 PHP
PHPCMS的使用小结
2010/09/20 PHP
PHP 获取远程网页内容的代码(fopen,curl已测)
2011/06/06 PHP
php采用file_get_contents代替使用curl实例
2014/11/07 PHP
基于PHP+Mysql简单实现了图书购物车系统的实例详解
2020/08/06 PHP
JavaScript DOM学习第六章 表单实例
2010/02/19 Javascript
jquery.jstree 增加节点的双击事件代码
2010/07/27 Javascript
IE图片缓存document.execCommand("BackgroundImageCache",false,true)
2011/03/01 Javascript
contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
2011/09/13 Javascript
实例详解jQuery Mockjax 插件模拟 Ajax 请求
2016/01/12 Javascript
通过BootStrap实现轮播图的实际应用
2016/09/26 Javascript
详解vue+vueRouter+webpack的简单实例
2017/06/17 Javascript
Vue中render方法的使用详解
2018/01/26 Javascript
vue组件创建的三种方式小结
2020/02/03 Javascript
vue设置默认首页的操作
2020/08/12 Javascript
Python实现好友全头像的拼接实例(推荐)
2017/06/24 Python
Python中使用Counter进行字典创建以及key数量统计的方法
2018/07/06 Python
pytorch 数据集图片显示方法
2018/07/26 Python
django DRF图片路径问题的解决方法
2018/09/10 Python
Python 使用list和tuple+条件判断详解
2019/07/30 Python
Python values()与itervalues()的用法详解
2019/11/27 Python
基于Python获取照片的GPS位置信息
2020/01/20 Python
查看keras的默认backend实现方式
2020/06/19 Python
Python jieba结巴分词原理及用法解析
2020/11/05 Python
Mio Skincare英国官网:身体紧致及孕期身体护理
2018/08/19 全球购物
西铁城美国官方网站:Citizen Watch美国
2019/11/08 全球购物
新闻专业大学生找工作的自我评价
2013/10/30 职场文书
土木工程专业推荐信
2014/02/19 职场文书
艺术教育实施方案
2014/05/03 职场文书
社团活动总结怎么写
2014/06/30 职场文书
2014年行政助理工作总结
2014/11/19 职场文书
开学典礼观后感
2015/06/15 职场文书
会计专业自荐信范文
2019/05/22 职场文书
vue项目proxyTable配置和部署服务器
2022/04/14 Vue.js
Android使用EventBus发送消息,Fragment中接收消息的方法会执行多次
2022/04/24 Java/Android