js正则表达式replace里有变量的解决方法用到RegExp类


一直比较害怕使用正则表达式,貌似很深奥很复杂的样子,所以在用js操作字符串的时候,我最多使用的是replace、split、substring、indexOf等函数,这些函数有时候需要多次叠加使用,但是用起来比较简单,语法和书写格式比较容易记住,所以使用率是相当高的。

今天在操作一段字符串时,需要揪出字符串里的一个数字,虽然用split、substring、indexOf这几个函数的结合使用能实现,但是如果用下正则表达式,则效果好很多,正则表达式的最大作用不就是匹配吗?于是尝试使用正则表达式来编写程序。



  • var s = '我正在使用卡卡网www.webkaka.com来测试网站速度';
  • var s = s.replace(/([\s\S]*)卡卡网([a-z.]*)([\s\S]*)/ig,'$2');
  • alert(s);


 

这样的结果可以得到网址“www.webkaka.com”。

但是当上述语句的“卡卡网”是一个变量时,replace()就出现了问题。

我开始这样写:


  • var s = '我正在使用卡卡网www.webkaka.com来测试网站速度';
  • var words = '卡卡网';
  • var s = s.replace(/([\s\S]*)'+words+'([a-z.]*)([\s\S]*)/ig,'$2');
  • alert(s);


 

但是运行结果是:我正在使用卡卡网www.webkaka.com来测试网站速度。也就是没有把网址给取出来。

然后又试了很多方法,都不顶用。

看来这里用replace()是行不通了,最后解决的方式变得比较复杂,写法如下:


  • var s = '我正在使用卡卡网www.webkaka.com来测试网站速度';
  • var words = '卡卡网';
  • var regExp=new RegExp("([\s\S]*)"+words+"([a-z.]*)([\s\S]*)","gmi");
  • regExp.test(s);
  • var url = RegExp.$2;
  • alert(url);


 

运行结果是:www.webkaka.com

这里用到RegExp类,下面解释下上述语句的含义。


  • var regExp=new RegExp(); //是定义一个正则表达式实例


 

[\s\S]* 可以匹配所有字符,包括换行符等不可见符号。

[a-z.]* 是匹配网址,当然,这个写法只能匹配包含小写字符的网址,扩充写法是[a-zA-Z0-9.~]*就可以包含大部分网址了。

gmi 是,g表示全局扫描,如果不加,那么只匹配第一个匹配到的。加了g选项后,每一次匹配后,就会往下匹配。当扫描不到匹配的字符时,则返回null。i表示不区分大小写。

regExp.test(s); //s是原字符串,用regExp的正则去匹配出想要的一段字符串。

RegExp.$2; //这个是取第2个匹配项,每一个括号()是一个匹配项。

 

 

知识扩充

js正则表达式基本语法及简单实例

1、 javascript 正则对象创建 和用法

声明javascript 正则表达式


  • var reCat = new RegExp("cat");


 

你也可以 



  • var reCat = /cat/;      //Perl 风格   (推荐)


 

2 、学习最常用的 test exec match search  replace  split 6个方法

1) test  检查指定的字符串是否存在



  • var data = "123123";
  • var reCat = /123/gi;
  • alert(reCat.test(data));  //true


 

//检查字符是否存在  g 继续往下走  i 不区分大小写

2) exec 返回查询值



  • var data = "123123,213,12312,312,3,Cat,cat,dsfsdfs,";
  • var reCat = /cat/i;
  • alert(reCat.exec(data));  //Cat


 

 3)match  得到查询数组


• var data = "123123,213,12312,312,3,Cat,cat,dsfsdfs,";
• var reCat = /cat/gi;
• var arrMactches = data.match(reCat)
• for (var i=0;i < arrMactches.length ; i++)
• {

•     alert(arrMactches[i]);   //Cat  cat
• }

 

4) search  返回搜索位置  类似于indexof


  • var data = "123123,213,12312,312,3,Cat,cat,dsfsdfs,";
  • var reCat = /cat/gi;
  • alert(data.search(reCat));  //23


 

5) replace  替换字符  利用正则替换

  • var data = "123123,213,12312,312,3,Cat,cat,dsfsdfs,";
  • var reCat = /cat/gi;
  • alert(data.replace(reCat,"libinqq"));


 

6)split   利用正则分割数组


• var data = "123123,213,12312,312,3,Cat,cat,dsfsdfs,";
• var reCat = /\,/;
• var arrdata = data.split(reCat);
• for (var i = 0; i < arrdata.length; i++)
• {

•     alert(arrdata[i]);
• }

3、学习下  简单类   负向类  范围类  组合类

 //简单类


• var data = "1libinqq,2libinqq,3libinqq,4libinqq";
• var reCat = /[123]libinqq/gi;
• var arrdata = data.match(reCat);
• for (var i = 0; i < arrdata.length; i++)
• {

•     alert(arrdata[i]);  // 1libinqq 2libinqq  3libinqq
• }


 

 //负向类

• var data = "alibinqq,1libinqq,2libinqq,3libinqq,4libinqq";  //\u0062cf
• var reCat = /[^a123]libinqq/gi;
• var arrdata = data.match(reCat);
• for (var i = 0; i < arrdata.length; i++)
• {

•     alert(arrdata[i]);  //4libinqq
• }

 

//范围类

• var data = "libinqq1,libinqq2,libinqq3,libinqq4,libinqq5";  //\u0062cf
• var reCat = /libinqq[2-3]/gi;
• var arrdata = data.match(reCat);
• for (var i = 0; i < arrdata.length; i++)
• {

•     alert(arrdata[i]);   // libinqq2  libinqq3
• }


 

//组合类


• var data = "a,b,c,w,1,2,3,5";  //\u0062cf
• var reCat = /[a-q1-4\n]/gi;
• var arrdata = data.match(reCat);
• for (var i = 0; i < arrdata.length; i++)
• {

•     alert(arrdata[i]);  // a b c 1 2 3
• }