【正则表达式】javascript正则表达式

1、反向引用:

概念:表达式计算完后每个分组被存放在一个特殊的地方以备将来使用,这些存储在分组中的特殊值就称为反向引用。第一个反向引用保存在RegExp.$1中,如果存在第二个、第三个反向引用,则依次保存在RegExp.$2、RegExp.$3中,依此类推。

使用正则表达式对象的test()、match()或search()后,方向引用的值可以从RegExp构造函数中获得。代码如下:

var sToMatch="#15813312305";
var reTel=/#(\d+)/;
reTel.test(sToMatch);
alert(RegExp.$1); //15813312305
alert(RegExp.$0); //undefined

可以在定义分组的表达式中包含反向引用,通过使用特殊的转义序列如\1、\2、\3等实现。

var sToMatch="catcatdog"
var reCatDog=/(cat)(\1dog)/
alert(reCatDog.test(sToMatch));//true
alert(RegExp.$1);//cat
alert(RegExp.$2);//catdog

2、非捕获性分组:

创建反向引用的分组,我们称之为捕获性分组,非捕获性分组则不会创建反向引用,即不存储匹配的分组。

通过非捕获性分组,可以拥有与匹配字符串序列同样的能力,而无需存储结果的开销。

var sToMatch="#15813312305";
var reTel=/#(?:\d+)/;
reTel.test(sToMatch);
alert(RegExp.$1); //输出""
再看一个例子:
var sToMatch="#15813312305";
var reTel=/#(\d+)/;
alert(sToMatch.replace(reTel,"86 $1"));//86 15813312305
//这里$1不被看成反向引用,而是被作为字符串直接翻译
var reTel=/#(?:\d+)/;
alert(sToMatch.replace(reTel,"86 $1"));//86 $1

3、前瞻:

告诉正则表达式运算器向前看一些字符而不移动其位置,分正向前瞻和负向前瞻。正向前瞻检查的是接下来出现的是不是某个特定的字符集,而负向前瞻则是检查接下来的不应该出现的字符集。

创建正向前瞻要将模式放在"(?=" 和 ")"之间,负向前瞻则要将模式放在"(?!" 和 ")"之间,注意这不是分组。

var sToMatch1="thinking";
var sToMatch2="thinked";
var reThink1=/(think(?=ing))/;//正向前瞻
var reThink2=/(think(?!ing))/;//负向前瞻
alert(reThink1.test(sToMatch1));//true
alert(RegExp.$1);//think
alert(reThink1.test(sToMatch2));//false
alert(reThink2.test(sToMatch1));//false
alert(reThink2.test(sToMatch2));//true
alert(RegExp.$1);//think
尽管javascript支持正则表达式前瞻,但它不支持后瞻。后瞻可以匹配这种模式:匹配b当且仅当它前面没有a。

4、正则表达式量词的贪婪(greedy)、惰性(reluctant)和支配(possessive)

     贪婪量词先看整个字符串是否匹配。如果没有发现匹配,去掉该字符串中的最后一个字符,并再次尝试。如果还是没有发现匹配,那么再次去掉最后一个字符,重复以上过程直到发现一个匹配或者字符串不剩任何字符。 
     惰性量词先看字符串中第一个字母是否匹配。如果单独这一字符还不够,就读入下一个字符,组成两个字符的字符串。如果还是没有发现匹配,惰性量词继续从字符串中添加字符直到发现匹配或者整个字符串都检查过夜没有发现匹配。惰性量词的工作方式与贪婪量词恰好相反。
      支配量词只尝试匹配整个字符串。如果整个字符串不能产生匹配,不做进一步尝试。
贪婪 惰性 支配 描述
? ?? ?+ 零次或一次出现
* *? *+
零次或多次出现
+ +? ++ 一次或多次出现
{n} {n}? {n}+ 恰好n次出现
{n,m} {n,m}? {n,m}+ 至少n次至多m次
{n,} {n,}? {n,}+ 至少n次出现
var sToMatch="abbbaabbbbaaabbb123";
var re1=/(.*bbb)/g;
alert(re1.test(sToMatch));//true
alert(RegExp.$1);//abbbaabbbbaaabbb
var re2=/.?bbb/g;
alert(re2.test(sToMatch));//true
var re3=/.+bbb/g;
alert(re3.test(sToMatch));//true -> Mozilla将支配量词看作是贪婪
      浏览器对支配量词的支持还不完善。IE和Opera不支持支配量词,如果要用它,则会抛出一个错误。Mozilla不会产生错误,但是它将支配量词看做是贪婪的。



你可能感兴趣的:(正则表达式,greedy,possessive,reluctant)