首页 > 代码库 > RegExp类型

RegExp类型

RegExp类型

ECMScript是通过RegExp类型来支持正则表达式。

有两种创建正则表达式的方式:

(1)字面量形式:

var expression=/pattern/flags;

(2)使用RegExp构造函数:

var expression=new RegExp("pattern","flags");

其中,要特别注意的是在构造函数中的字符转义和字面量形式中的字符转义,稍后有提到。

pattern可以是任何简单或者复杂的正则表达式,可以包含字符类、限定符、分组、向前查找以及反向引用。flags用以标明正则表达式的行为,正则表达式的匹配模式支持下列三个标志:

  • g:表示全局模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即停止。
  • i:表示不区分大小模式,即在确定匹配项时忽略模式和字符串的大小写。
  • m:表示多行模式,即在到达一行文本末尾时还会继续查找下一行中是否存在与模式匹配的项。
var pattern1=/at/g;    //匹配字符串中所有的at的实例
var parttern2=/[bc]at/i;    //匹配第一个“bat”或“cat”,不区分大小写
var parttern3=/.at/gi;    //匹配所有以“at”结尾的3个字符串的组合,不区分大小写 

模式中使用的所有元字符都必须转义。正则表达式中的元字符包括:([{\^$|)?*+.]}想要匹配这些符号,都必须转义,由于RegExp构造函数的模式参数是字符串,所以在某些情况下要对字符进行转义。所有元字符都必须双重转义。如下示例:

字面量模式 等价的字符串
/\[bc\]at/ "\\[bc\\]at"
/\.at/ "\\.at"
/name\/age/ name\\/age
/\d.\d{1,2}/ \\d.\\d{1,2}
/\w\\hello\\123/ \\w\\\\hello\\\\123

 注意:使用字面量创建正则表达式始终会共享同一个实例,而使用构造函数创建的每一个新RegExp实例都是一个新实例。看下面例子:

var re=null,
        i=;
for(i=0;i<10;i++){
        re=/cat/g;
        re.test("catastrophe");
}

for(i=0;i<10;i++){
        re=new RegExp("cat","g");
        re.test("catastrophe");
}

在第一个循环中,即使是循环体中指定的,但是实质上只为/cat/创建了一个RegExp实例。由于实例属性不会重置,所以在循环中再次调用test()方法会失败。这是因为第一次调用test()找到了“cat”但第二次调用是从索引为3的字符开始的,所以就找不到它了。由于会测试到字符串的末尾,所以下一次再次调用test()就又从开头开始了。

第二个循环使用了RegExp的构造函数在每次循环中创建实例,因为每次迭代都会创建一个新的RegExp实例,所以每次调用test()都会返回true。

RegExp实例属性

  • global:布尔值,表示是否设置了g标志;
  • ingoreCase:布尔值,表示是否设置了i标志;
  • multiline:布尔值,表示是否设置了m标志;
  • lastIndex:整数,表示开始搜索下一个匹配项的字符串位置,从0开始;
  • source:正则表达式的字符串表示,按字面量形式而非传入构造函数中的字符串模式返回。
var pattern1=/\[bc\]at/i;

alert(pattern1.global);    //false
alert(pattern1.ingnoreCase);    //true
alert(pattern1.lastIndex);    //0
alert(pattern1.multiline);    //false
alert(pattern1.source);        //"\[bc\]at"

RegExp实例方法

(1)exec()

接受一个参数,即要应用模式的字符串,然后返回包含第一个匹配项信息的数组;或者在没有匹配项的情况下返回null。返回的数组虽然是Array的实例,但包含两个额外的属性:inndex和input。其中,index表示匹配项在字符串中的位置,而input表示应用正则表达式的字符串。在数组中,第一项是与整个模式匹配的字符串,其他项是与模式中的捕获组匹配的字符串。看下例:

var text="mom and dad and bady";
var pattern=/mom( and dad( and bady)?)?/gi;
var matches=pattern.exec(text);
alert(matches.index);    //0
alert(matches.input);    //"mom and dad and bady"
alert(matches[0]);    //"mom and dad and bady"
alert(matches[1]);    //" and dad and bady"
alert(matches[2]);    //" and bady"

对于exec()方法而言,即使设置了全局标志(g),他每次也只会返回一个匹配项。在不设置全局标志的情况下,在同一个字符串上多次调用exec()将始终返回第一个匹配项的信息。而在设置全局标志的情况下,每次调用exec()将都会在字符串查找新的匹配项。

(2)test()

接受一个字符串参数。在模式与字符串参数匹配的情况下返回true;否则,返回false。在只想知道目标字符串与某个模式是否匹配,而不需要知道其文本内容时,使用这个方法。

RegExp类型