玩转javascript RegExp对象

js中的正则表达式

js的正则表达式语法极大地借鉴了另一种脚本语言Perl的正则表达式语法.
RegExp对象是js的一个内置对象,与String,Array类似。

创建RegExp对象

  1. 可通过构造函数RegExp()创建。---当要根据用户输入来构造正则表达式时,必须采用构造函数方式。

    var re=new RegExp("\\b","gi");
    

    需要注意的是\b这个特殊字符在js中表示退格,在正则表达式中特殊字符之前需要再加一个反斜杠,因此变成了\\b,正则表达式作为参数传给RegExp()构造函数,属性字符g,i,m作为构造函数的第二个参数.

  2. 可通过字面量语法创建,例:

    var re=/\d\d/;

    其中斜杠(/)表示正则表达式的开始和结束。告诉js,这是一个正则表达式,就像引号是字符串的开始和结束一样的.

语法

var patt=new RegExp(pattern,modifiers);

或者更简单的方式:

var patt=/pattern/modifiers;
  • pattern(模式) 描述了表达式的模式
  • modifiers(修饰符) 用于指定全局匹配、区分大小写的匹配和多行匹配

    • G---全局匹配,查找所有与模式匹配的子串,而不是在找到第一个匹配的字符后就停止
    • I---模式不区分大小写。如:Paul与paul被看做相同的字符模式。
    • m---多行标志。制定特殊字符^和$可以匹配多行文本和字符串的开始和结束

正则表达式和String对象的split()-返回数组,match-返回数组,search()-返回索引,在正则表达式中也只能找到第一个匹配的字符组,全局匹配对它无效,replace()-替换结合使用才能发挥它的强大功能。
具体的正则表达式特殊字符就不在此列举了(太多了)。

简单的实例

我们就举几个简单的例子了解一下正则表达式的功能实现
实例1. 要匹配1-800-888-5474的电话号码,使用正则表达式:

var a="1-800-888-5474";
var re=/\d-\d{3}-\d{3}-\d{4}/gi;
var b=a.match(re);
console.log("b:"+b);

后台输出b:1-800-888-5474,d{3}表示出现三个数字,{n}表示前一项出现n次,?表示前一项出现0次或1次

实例2.

    var a="1997,1998,2000,2001,2002,2000,paul,paula,paulab,pau";    
    var b=a.match(/2000?1?2?/gi);
    var d=a.match(/paul?a?b?/gi);
    var e=a.replace(/2000?1?2?/gi,"2017")
    var f=a.replace(/paul?a?b?/gi,"room")    
    console.log("b:"+b);
    console.log("d:"+d);
    console.log("e:"+e);
    console.log("f:"+f);

输出结果如下:
图片描述

示例中,
b:输出19世纪的年份组成的数组
d:输出所有含有pau字符组成的数组
e:把字符串中的19世纪年份全替换为2017年
f:把字符串中含有pau的字符串全部替换为room.

实例3. 位置字符\b,\B的深入理解

    var a="hello world,I am a girl.";
    var re1=/\b/gi;
    var re2=/\B/gi;
    var b=a.replace(re1,"|");
    var c=a.replace(re2,"|");
    console.log("b:"+b);
    console.log("c:"+c);

结果如下:
图片描述

可以从结果中看出:\b的位置是在单词的前后(单词字符与非单词字符之间的位置),\B的位置在单词的前后,除却了\b位置,剩余的所有位置。

实例4. 正则表达式的分组
如何实现分组的,只需要将它们放在()中,正则表达式中的()是将字符模式组合起来的特殊字符,圆括号本身不是要匹配的字符。
如:

var s="javascript,vbscript and php";

要求用同一个正则表达式匹配javascript和vbscript.

var s="javascript,vbscript and php";
var re=/\b(vb|java)script\b/gi;
s=s.replace(re,"aa");
alter(s);

其中|,是分组里面的特殊字符,和||(或)的含义是一样的。

实例5:单引号替换双引号

var re=/\B'|'\B/gi;

实例6:使用$引用分组

var a="2012,2013,2014"
//把a修改为"2012年,2013年,2014年"
var re=/(\d{4})/gi;
//就可以在替换的字符中使用序号1的分组了:
a=a.replace(re,"$1年");
//输出2012年,2013年,2014年。

还有其他的方法可以实现,这个我觉得相对简便一些,具体的用法还要在实际项目中使用。


INT2MAIN
30 声望2 粉丝