教你轻松记住JS正则表达式(2)

var str = "我爱北京天安门,天安门上太阳升。"; var re = /北京|天安门/g; // 找到北京 或者天安门 全局匹配 var str2 = str.replace(re,'*'); alert(str2) //我爱**,*上太阳升 //这种只是把找到的变成了一个*,并不能几个字就对应几个*。

要想实现几个字对应几个*,我们可以用回调函数实现:

复制代码 代码如下:


var str = "我爱北京天安门,天安门上太阳升。";
var re = /北京|天安门/g;  //  找到北京 或者天安门 全局匹配
var str2 = str.replace(re,function(str){
              alert(str); //用来测试:函数的第一个参数代表每次搜索到的符合正则的字符,所以第一次str指的是北京 第二次str是天安门 第三次str是天安门
            var result = '';
            for(var i=0;i<str.length;i++){
                result += '*';
            }             
            return result; //所以搜索到了几个字就返回几个*
        });
alert(str2)  //我爱*****,***上太阳升        
//整个过程就是,找到北京,替换成了两个*,找到天安门替换成了3个*,找到天安门替换成3个*。

replace是一个很有用的方法,经常会用到。

正则中的字符

():,小括号,叫做分组符。就相当于数学里面的括号。如下:

复制代码 代码如下:


var str = '2013-6-7';
var re1 = /\d-+/g;  // 全局匹配数字,横杠,横杠数量至少为1,匹配结果为:  3- 6-
var re1 = /(\d-)+/g;  // 全局匹配数字,横杠,数字和横杠整体数量至少为1   3-6-
var re2  = /(\d+)(-)/g;   //  全局匹配至少一个数字,匹配一个横杠 匹配结果:2013- 6-

同时,正则中的每一个带小括号的项,都叫做这个正则的子项。子项在某些时候非常的有用,比如我们来看一个栗子。

例子:让2013-6-7 变成 2013.6.7

复制代码 代码如下:


var str = '2013-6-7';
var re = /(\d+)(-)/g;
str = str.replace(re,function($0,$1,$2){
   
       //replace()中如果有子项,
      //第一个参数:$0(匹配成功后的整体结果  2013-  6-),
         // 第二个参数 : $1(匹配成功的第一个分组,这里指的是\d   2013, 6)
        //第三个参数 : $1(匹配成功的第二个分组,这里指的是-    - - )  
    return $1 + '.';  //分别返回2013.   6.
   
});
alert( str );   //2013.6.7
//整个过程就是利用子项把2013- 6- 分别替换成了2013. 6.  最终弹出2013.6.7

match方法也会返回自己的子项,如下:

复制代码 代码如下:


var str = 'abc';
var re = /(a)(b)(c)/;
alert( str.match(re) );  //[abc,a,b,c]( 返回的是匹配结果 以及每个子项  当match不加g的时候才可以获取到子项的集合)

补充:exec()方法:和match方法一样,搜索符合规则的内容,并返回内容,格式为数组。

用法:正则.exec(字符串);

属性:input(代表要匹配的字符串) 

栗子:不是全局匹配的情况:

复制代码 代码如下:


 var testStr = "now test001 test002";  
 var re = /test(\d+)/; //只匹配一次    
 var r = "";  
 var r = re.exec(testStr)
  alert(r);// test001  001 返回匹配结果,以及子项
  alert(r.length); //2   返回内容的长度
  alert(r.input); //now test001 test002    代表每次匹配成功的字符串
  alert(r[0]);   //test001  
  alert(r[1]);  //001    代表每次匹配成功字符串中的第一个子项 (\d+)
  alert(r.index );   //  4   每次匹配成功的字符串中的第一个字符的位置

全局匹配:如果是全局匹配,可以通过while循环 找到每次匹配到的字符串,以及子项。每次匹配都接着上次的位置开始匹配

复制代码 代码如下:


 var testStr = "now test001 test002";  
 var re = /test(\d+)/g;   
 var r = "";  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjpyjy.html