一:关于RegExp的定义
JS对正则表达式的支持是通过RegExp类实现的,定义一个正则有两种方式:用RegExp对象的构造函数,字面量的方式。
1:RegExp函数有一个或两个参数,前者为匹配的模式字符串,后者为指定额外的处理指令。如:var reCat = new RegExp("cat","gi");
2:字面量表示方式,如:var reCat = /cat/gi;
<注意:两种定义方式在使用元字符和特殊字符时,前者要用两个斜杠(//)进行双重转义,如:var reTest = new RegExp("//n","gi");后者只用一个斜杠就OK了>
二:RegExp常用的函数
1:test()返回布尔值,表示是否有一个匹配成功;var test = reCat.test(“cat”);
2:exec()有一个字符串参数,返回的一个数组,第一个条目为第一个匹配,其他的为反向引用。
例:var sTest1="red"; var sTest2="blue"; var reRedOrBlue = /(red|blue)/; reRedOrBlue.test(sTest1); alert(reRedOrBlue.exec(sTest1));这里返回的是两个red,前者表示第一个匹配,后者表示反向引用。
3:String对象的match(),返回字符串中所有匹配的数组,
例:var sToMatch =”a bat,a Cat,a fat cat”; var reCat = /at/gi; var arrMatches = sToMathch(reCat);返回有”bat” ,”Cat”,”fat”,”cat”数组。
4:search();返回的是字符串中出现的一个匹配的位置,同indexof()有些类似,不过它用的是一个RegExp对象。
例:var sToMatch =”a bat,a Cat,a fat cat”; var reCat = /at/gi; sToMatch.search(reCat); //返回的是出现第一个匹配时,它在字符串的位置,这里为3,也就是'bat'中的'at'
三:语法结构
js中正则表达式的语法结构
简单模式:元字符,特殊字符,字符类(简单类,负向类,范围类,组合类,预定义类),量词(简单量词,贪婪性量词,惰性的量词,支配性的量词)
复杂模式:分组,反向引用,候选,非捕获性分组,前瞻,边界,多行模式。
1,元字符下特殊字符注意前面所提到的在两种不同的定义方式的转义形式。
2,简单类,表示形式 var reMatch = /[bc]a/; 说明:在[]之间的字符,的字符不可以同时出现,只可以出现其中的个就可以。
例: var sToMatch = "a bat,cat,bcat,at";
var reAt = /[bc]at/gi;
alert(sToMatch.match(reAt));
说明:这里返回的有"bat","cat","cat'.因为每一项中都有且只含有[bc]中的一项。
3,负向类, 指定要排除的字符,脱字符号(^)告诉正则表达式字符不能匹配后面跟着的字符。
例:var sToMatch ="a bat,cat fat,at";
var reAt = /[^bc]at/gi; //表示at前面不含有b或c的所有匹配
sToMatch.match(reAt); //返回:"fat","at"
4:范围类,可以指定正则表达中字符串的的范围,不用逐个地输入,如要表示小写字母的匹配,可以用[a-z].
5:组合类,由几种其他的类组合而成的字符类放入到下[]中,<注意:内部的类之间不要有空格分开,js不支持交叉类>
例:var reTest = /[a-g1-5/n]/gi;表示匹配所有从a到g,1到4,以及下个换行符。
6:预定义类:由于一些是常用的模式,所以用一组预定义的字符类来指定复杂类。
/d [0-9] 数字
/D [^0-9] 非数字
/s 空白字符
/S 非空白字符
/w [a-zA-Z0-9_] 单词字符(所有的字母,所有的数字,下划线。
7:量词:指定某个特定的模式在正则表达式中出现的次数,可以是硬性数量,也可以是软性数量。
A简单量词
? 出现0或1次
× 出现0或无数次
+ 出现1或无数次
{n} 出现n次
{,n} 出现至少n次
{m,n} 出现m到n次
B1.贪婪的量词:
B2。惰性量词:
B3.支配量词:因为该量词在IE和Opera下都不支持,所以就不用多说。
复杂模式
1.分组:通过用一系列的括号包围一系列字符、字符类以入量词来使用的。
例:var re1=/(dog){2}/gi; 表示,()内的'dog'就是一个分组,他可以看成一个整体来做处理,这里表示‘dog’在模式中连续出现两次。<说明:常常和反向引用一现用。>
2.反向引用。含有分组的表达式计算完后,每个分组都被存放在一个特殊的地方以便将来使用,这些存放在分组中的特殊值,就叫“反向引用”。反向引用是与分组的左括号的顺序来进行创建和编号的。
,反向引用的表示有两种方式:RegExp.$1表示调用第一个反向引用,也可以用/1表示。
A反向引用的使用方法
A1,在正则后的test,match或search方法后,反向引用的值就可以用RegExp的构造函数来获得,
A2,可以在定义分组的的表达式中包含反向引用。如var reCatCat=/(cat)/1/;表示两上个'cat';
A3,(常用)在String对象的replace方法中使用,这时它有两个参数,前一个为正则表达式,后一个为反向引用,后者来替换字符串的东西。
3,候选.对同一个表达式匹配多个字符时,可以运用候选,这样就可减少很多的冗余处理。表示形式,var reRedOrBlack = /red|black|blue/gi;
说明:该表达式可以指定含有"red","black","blue"其中任何一个的字符串进行匹配。也可以用在分组中运用,如:var reRedOrBalck = /(red|black)/gi;
例:var sTest="red"; reRedOrBlack.exec(sTest);这时返回的是'red','red',前一个为第一个匹配的字符 ,后者表示返回的反向引用RegExp.$1.
<说明:这种形式同replace()一起使用,常常放在论坛中,对论坛内容进行过滤>
4,非捕获性分组:创建有反向引用的“分组”,叫做“捕获性分组”;而另外一种不会创建反向引用的“分组”,叫做“非捕获性分组”。二者的区别:存储反向引用会降低匹配速度,而后者具有匹配的能力,而不必要存储结果的开销。
,表示形式:在左括号后面加上?:就可以了 ,例:var reNumbers = /(?:/d+)/;这时用RegExp.$1不会得到“反向引用”。
5,前瞻:当某一个特定的字符出现在另一个字符之前时,才去捕获它,这时就可以用”前瞻“来解决。
A正向前瞻: 表示形式:(?=)它用到了括号,但不表示分组,
例:var reBed = /(bed(?=room))/;表示bed,出现在room之前。这时用RegExp.$1可以得到"bed",但用RegExp.$2却没有任何值,因为这时的括号不表示分组。
B负向前瞻:表示一个特定的字符不可以在另一个字符之前时,才去捕获它。、
表示形式:(?!).
例:var reBed = /(bed(?!room))/; 表示在"room",之前不是"bed"时捕获它。
2009-12-17