正则表达式

一.正则表达式基础

0.g表示全局,i表示不区分大小写,m表示多行模式。

1.点字符(英文句号)可以匹配任何一个单个字符。

2.反斜杠表示转义。例\.表示匹配点字符而不是任何一个单个字符。

3.[ns]表示匹配n或s。

4.[0-9]表示[0123456789],[a-z][A-Z]同理。

5.元字符^来表明对一个字符集合进行取非匹配。例[^0-9]表示出0-9以外的字符。

6.\f(换页符),\n(换行符),\r(回车符),\t(制表符),\v(垂直制表符)。

换行符:一个长行截成俩行还属于同一段落。

回车符:分成俩个段落了。

7.\d:任何一个数字字符。相当于[0-9]。

 \D:任何一个非数字字符。相当于[^0-9]。

 \w:任何一个字母数字字符(大小写均可)或下划线。相当于[a-zA-Z0-9]。

 \W:[^a-zA-Z0-9]。

 \s:任何一个空白字符。相当于[\f\n\r\t\v]。

 \S:任何一个非空白字符。相当于[^\f\n\r\t\v]。

8.+:匹配一个或多个字符。

 *:匹配0个或多个字符。

 ?:匹配1个或0个字符。

9.{3}:重复3次。

 {2,}重复2次以上。

10:懒惰型元字符:*?,+?。

var sToMatch="abbbaabbbaaabbb1234"
   var re1=/.*bbb/gi;
   var re2=/.*?bbb/g;
   var Match1=re1.exec(sToMatch);
   var Match2=re2.exec(sToMatch);
   alert(Match1);//abbbaabbbaaabbb
   alert(Match2);//abbb

11.\b表示边界。

例:var sToMatch1="abcd";
   var sToMatch2="bcd";
   var sToMatch3="bcde";
   var reBcd=/\bbcd\b/g;
   alert(reBcd.test(sToMatch1));//false
   alert(reBcd.test(sToMatch2));//ture
   alert(reBcd.test(sToMatch3));//false

12.^匹配一个字符串的开头,$匹配一个字符串的结尾。

13.|表示候选。

例:var sToMatch1="red";
   var sToMatch2="black";
   var reRedOrBlack=/(red|black)/;
   alert(reRedOrBlack.test(sToMatch1));//true
   alert(reRedOrBlack.test(sToMatch2));//true

14.new RegExp

注意点1:var pattern1=/[bc]at/gi;

  var pattern2=new RegExp["[bc]at","gi"];

  pattern1等价于pattern2。

注意点2:转义要进行双重转义。

注意点3:\n通常转义为\\,双重转义后为\\\\。

  

二.函数的使用。

1.test()。返回true或false。

例:var sToMatch="cat";
   var reCat=/cat/;//var reCat=new RegExp("cat","gi");也可用这种方式。
   alert(reCat.test(sToMatch));//true

2.search:返回在字符串中出现的一个匹配的位置。

例:var sToMatch="a bat, a Cat, a fAt baT, a faT cat";
   var reAt=/at/gi;
   alert(sToMatch.search(reAt));

3.replace:替换。

var sToChange="The sky is red";
   var reRed=/red/;
   alert(sToChange.replace(reRed,"blue"));//The sky is blue

4.split

var sColor="red,blue,yellow,green";
   var reComma=/\,/;
   var arrColors=sColor.split(reComma);
   for(var i=0;i<4;i++)
   {
      alert(arrColors[i]);
   }//一次输出red,blue,yellow,green。

5.trim().//去掉字符俩端的空格

String.prototype.trim=function()
   {
      var reExtraSpace=/^\s+(.*?)\s+$/;
      return this.replace(reExtraSpace,"$1");
   }
   var sTest="     This is a test         ";
   alert("["+sTest+"]");//[     This is a test         ]
   alert("["+sTest.trim()+"]");//[This is a test]

6.match().

var sToMatch="a bat, a Cat, a fAt baT, a faT cat";
   var reAt=/at/gi;
   var arrMatches=sToMatch.match(reAt);
   for(var i=0;i<6;i++)
   {
      alert(arrMatches[i]);
   }//at at At aT at

7.exec().

var sToMatch="a bat, a Cat, a fAt baT, a faT cat";
   var reAt=/at/;
   var arrMatches=reAt.exec(sToMatch);
   for(var i=0;i<6;i++)
   {
      alert(arrMatches);
   }//at at at at at at

8.比较match与exec

var sToMatch="a bat, a Cat, a fat bat, a fat cat";
var reAt=/(a)(t)/g;
var arrMatches=sToMatch.match(reAt);
for(var i=0;i<6;i++) {
    console.log(arrMatches[i]);//at, at, at, at, at, at
}

  

var sToMatch="a bat, a Cat, a fat bat, a fat cat";
var reAt=/(a)(t)/;
var arrMatches=sToMatch.match(reAt);
for(var i=0;i<6;i++) {
    console.log(arrMatches[i]);//at, a, t, undefined, undefined, undefined
}

  

var sToMatch="a bat, a Cat, a fat bat, a fat cat";
var reAt=/(a)(t)/;
var arrMatches=reAt.exec(sToMatch);
for(var i=0;i<6;i++) {
    console.log(arrMatches[i]);//at, a, t, undefined, undefined, undefined
}

  

var sToMatch="a bat, a Cat, a fat bat, a fat cat";
var reAt=/(a)(t)/g;
var arrMatches=reAt.exec(sToMatch);
for(var i=0;i<6;i++) {
    console.log(arrMatches[i]);//at, a, t, undefined, undefined, undefined
}

 

var sToMatch="a bAt, a Cat, a fat bat, a fat cat";
var reAt=/(a)(t)/ig;
var arrMatches=reAt.exec(sToMatch);
for(var i=0;i<6;i++) {
    console.log(arrMatches[i]);//At, A, t, undefined, undefined, undefined
}
var arrMatches=reAt.exec(sToMatch);
for(var i=0;i<6;i++) {
    console.log(arrMatches[i]);//at, a, t, undefined, undefined, undefined
}

1. 只有在正则表达式必须指定全局g属性时,match才能返回所有匹配,否则match与exec方法结果无差异,是等价的,全局下exec第二次执行是会匹配下一个。exec会返回匹配的位置信息。
2. exec永远返回与第一个匹配相关的信息,其返回数组第一个值是第一个匹配的字串,剩下的是所有分组的反向引用(即子括号的匹配内容,与全局(g)无关。

例:var someText= "web2.0 .net2.0" ;
var pattern=/(/w+)(/d)/.(/d)/g;
var outCome_exec=pattern.exec(someText);
var outCome_matc=someText.match(pattern);

exec执行后的最终结果是:["web2.0","web","2","0"]

outCome_matc为["web2.0","net2.0"]

三:模式:

1.反向引用

方式一:var sToMatch="#123456789";
   var reNumbers=/#(\d+)/;
   renumbers.test(sToMatch);
   alert(RegExp.$1);//123456789

方式二:var sToMatch="dogdog";
   var reDogDog=/(dog)\1/;
   alert(reDogDog.test(sToMatch));//true

2.前瞻:

var sToMatch1="bedroom";
   var sToMatch2="bedding";
   var reBed1=/(bed(?=room))/;
   var reBed2=/(bed(?!room))/;
   alert(reBed1.test(sToMatch1));//true
   alert(reBed1.test(sToMatch2));//false
   alert(reBed2.test(sToMatch1));//flase
   alert(reBed2.test(sToMatch2));//true

3.非捕获型分组

var sToMatch="#123456789";
   var reNumbers=/#(?:\d+)/;
   alert(sToMatch.replace(reNumbers,"$1"));//$1

 

四:理解RegExp对象

1.实例属性

global:g是否已设置。

ignoreCase:i是否已设置。

multiline:i是否已设置。

source:正则表达式元源字符串形式。

lastIndex:整数,代表下次匹配将会从哪个字符位置开始(只有当使用exec()和test()函数才会填入,否则为0。

var reTest=/[ba]*/i
   alert(reTest.global);//false
   alert(reTest.ignoreCase);//true
   alert(reTest.multiline);//false
   alert(reTest.source);//[ba]*

var sToMatch="bbg is short for barbecue"
   var reB=/b/g;
   reB.exec(sToMatch);
   alert(reB.lastIndex);//1
   reB.exec(sToMatch);
   alert(reB.lastIndex);//2
   reB.exec(sToMatch);
   alert(reB.lastIndex);//18
   reB.exec(sToMatch);
   alert(reB.lastIndex);//21

2.静态属性:

input:等价于$_。

lastMatch:等价于$&。

lastParen等价于$+。

leftContext等价于$`。

multiline等价于$*。

rightContext等价于$'。

var sToMatch="this has been a short,short summmer";
   var reShort=/(s)hort/g;
   reShort.test(sToMatch);
   alert(RegExp.input);//this has been a short,short summmer
   alert(RegExp.leftContext);//this has been a
   alert(RegExp.rightContext);//,short summmer
   alert(RegExp.lastMatch);//short
   alert(RegExp.lastParen);//s
   alert(RegExp.$_);//this has been a short,short summmer
   alert(RegExp["$`"]);//this has been a
   alert(RegExp["$'"]);//,short summmer
   alert(RegExp["$&"]);//short
   alert(RegExp["$+"]);//s

posted @ 2015-05-25 17:43  PLDaily  阅读(376)  评论(0编辑  收藏  举报