blog.programfan.info
新网站即将启用

[集]JS正则表达式学习

1     javascript 正则对象创建 和用法 

   <1>.var reCat = new RegExp("cat");
     <2>.var reCat = /cat/;      //Perl 风格   (推荐)

2 学习最常用的 test exec match search  replace  split 6个方法 ; g 继续往下走 i 不区分大小写

数量词贪婪,例: 

var reg1 = /\d.{1,}A{2}/g;
var reg2 = /\d.{1,}?A{2}/g;
var reg3 = /\d.{1,}?A{2}/;
str = "1.1AA22bAA33cAABBC";
str.match(reg1);//['1.1AA22bAA33cAA'];
str.match(reg2);//['1.1AA','22bAA','33cAA']
str.match(reg3);//['1.1AA']

  二  javascript  正则表达式是分组知识   

   1  非捕获性分组 :以 ?:开头,用于把()里面子表达式声明为不记录的
   2  前瞻 (断言):以?=?!开头,分别代表正向前瞻,否则代表反向前瞻。前瞻的意思是:正则表达式运算器向前看一些字符而不是移动位置
 
// 前瞻
      var sToMatch1 = "bedroom";
      var sToMatch2 = "bedding";
      var reBed = /bed(?=room)/; 
      alert(reBed.test(sToMatch1));  //true
      alert(reBed.test(sToMatch2));  //false
 //负向前瞻      
      var reBed = /bed(?!room)/; 
      alert(reBed.test(sToMatch1)); //false
      alert(reBed.test(sToMatch2)); //true
  7 边界
      var sToMatch = "Important word is the last one.";
      var reLastWord = /^(.+?)\b/; 
      reLastWord.test(sToMatch);
      alert(RegExp.$1);  //Important    
    /*
    这里,正则表达式用惰性量词来制定在单词边界之前可以出现任何字符,且可以出现一次或
    多次(如果使用贪婪性量词,表达式就匹配整个字符串)。
    */ 
    var data = " First second thind fourth fifth sixth ";  
    var reCat = /\b(\S+?)\b/g;   
    var arrdata = data.match(reCat);
    for (var i = 0; i < arrdata.length; i++)
    {
        alert(arrdata[i]);
    }   

1.贪心模式:如果我们希望正则尽量少地匹配字符,那么就可以在表示数字的符号后面加上一个?。组成如下的形式:

 {n,}?, *?, +?, ??, {m,n}?

2.点:.’会匹配字符串中除了换行符\n之外的所有字符

3./^开头,结尾$/:reg = /^b|c.+/;(匹配b或者c.+)

4.非:^在正则表达式开始部分的时候表示开头的意思,例如/^c/表示开头是c;但是在字符集和中,它表示的是类似“非“的意思,如:[^0-9]表示非数字,[^a-z]表示非小写字母

5.边界:\b表示的边界的意思,也就是说,只有字符串的开头和结尾才算数。例如/\bc/就表示字符串开始的c或者是结尾的c(注:\B非边界)

6.数字:\d表示数字的意思,相反,\D表示非数字

7.空格:\f匹配换页符,\n匹配换行符,\r匹配回车,\t匹配制表符,\v匹配垂直制表符。\s匹配单个空格,等同于[\f\n\r\t\v](\S表示非空格字符)

8.单词:\w表示单词字符,等同于字符集合[a-zA-Z0-9_](\W表示非单词字符,等效于[^a-zA-Z0-9_])

9.反向引用:/(子正则表达式)\1/(先匹配子正则表达式,然后再匹配整个的,其中的\1代表第一个子正则)例 :

reg = /(\w)(\w)\2\1/;
str='woow';
execReg(reg,str);//结果:woow, w, o
//说明:第一个子正则表示w,第二个子正则表示o,然后\2表示第二个子正则o与剩下的字符串匹配,\1表示第一个子正则w与再剩下的匹配,得到的结果是
//首先是整体:woow,其次是第一个的正则w,再次才是第二个的正则o

10.不记录正则表达式的匹配结果:使用形如(?:pattern)的正则就可以避免保存括号内的匹配结果。但这时反向引用也不好使了

11.正向预查:意思就是:要匹配的字符串,后面必须紧跟着pattern!(形式:(?=pattern))说明:

  正则表达式/cainiao/会匹配cainiao。同样,也会匹配cainiao9中的cainiao。但是我们可能希望,cainiao只能匹配cainiao8中的菜鸟。这时候就可以像下面这样写:/cainiao(?=8)/

12.?!:形式(?!pattern)和?=恰好相反

13.元字符:*+\.$()[],{}|^

转义字符:\f:换页;\n:换行;\r:回车;\t:制表;\b:退格;\o:空字符;\xnn:十六进制ASCII码;\uxxxx:十六进制指定的Unicode字符

预定义字符:{.[^\n\r]},{\d[0-9]},{\w[0-9a-zA-Z_]},{\s[\f\t\n\r]},{[\b]退格字符}

其他html字符:{&amp;,&}、{&quot;,  "}、{&lt;,<}、{&gt;,>}、{&nbsp,空格}

str = "Great hope make great man";
reg = /\s\w+\s/;
reg.match(str);//["make","great"]
//原因:Great前,man后没有空白符, 而make前后的空白符被hope,great占用

 

14.修饰符:<1>.g全局修饰符<2>i不分大小写修饰符<3>.m行首行尾修饰符

15.exec方法:用实例来说明

//公共函数实例:
function execReg(reg,str){
			   var result =  reg.exec(str);
			   document.write('string:' + result + '<br />' + 
			 		         'index:'+result.index+'<br  />' +
					         'input:'+result.input+'<br  />'
			 );
			 for(i=0;i<result.length;i++){
			 	document.write('result['+i+']:'+result[i]+'<br  />')
			 }
			}

  <1>返回值:exec方法返回的其实并不是匹配结果字符串,而是一个对象

var reg = /(\w)/;
var  str='bbs.bblueidea.com';
execReg(reg,str);
//结果:是个对象,index为在这个串中的index值,input为对应的那个字符串
//string:b
//index:0
//input:bbs.bblueidea.com
//result[0]:b
//result[1]:b

  <2>对正则表达式的更新:

var reg = /b/g;
var str =  'bs.blueidea.com';
execReg(reg,str);
execReg(reg,str);
//结果:这儿用到了全局修饰符,这儿的第一个是指向第一个b,第二个是指向第二个b(在第一个的基础上找剩下的字符串中对应正则的串)
//string:b
//index:0
//input:bs.blueidea.com
//result[0]:b
//string:b
//index:3
//input:bs.blueidea.com
//result[0]:b

16.test方法:仅仅检查是否能够匹配str,并且返回布尔值以表示是否成功

17.match方法:返回结果也是对象

18.replace,search,split方法:replace返回替换后的值,search返回序号,split返回切割后的数组

var reg =  /(\w+)\s(\w+)/;
var str = 'cainiao  gaoshou';
var newStr =  str.replace(reg,'$2 $1');
document.write(newStr);
//gaoshou cainiao

由于在替换文本里$有了特殊的含义,所以我们如果想要是用$这个字符的话,需要写成$$

var reg =  /(\w+)\s(\w+)/;
var str = 'cainiao  gaoshou';
var newStr =  str.replace(reg,'$$ $$');
document.write(newStr);
//$ $
var reg = /\W/;
var str =  'bbs.blueidea.com';
var pos =  str.search(reg);
document.write(pos);
//3
var  reg = /\W/;
var  str = 'http://www.baidu.com/';
var  arr = str.split(reg);
document.write(arr.length+'<br  />');
document.write(arr);
//7
//http,,,www,baidu,com,

 

 

 

参考资料:

1.温故知新 javascript 正则表达式

2.javascript正则表达式

posted @ 2010-12-06 11:00  Gordon Chao  Views(601)  Comments(0Edit  收藏  举报
www.programfan.info
新网站即将启用