5.4 RegExp类型

        ECMAScript通过RegExp类型来支持正则表达式。使用下面类似Perl的语法,就可以创建一个正则表达式。        
      

  1. var expression=/pattern/flags;
复制代码

       
        其中的模式(pattern)部分可以是任何简单或复杂的正则表达式,可以包含字符类、限定符、分组、向前查找以及反向引用。每个正则表达式都可以带有一个或多个标志(flags),用以标明正则表达式的行为。正则表达式的匹配模式支持下列3个标志。

        1、g:表示全局(global)模式,即模式 将被应用于所有字符串, 而非在发现第一个匹配项时立即停止;
        2、i:表示不区分大小写(case-insensitive)模式,即在确定匹配项时忽略模式与字符串的大小写;
        3、m: 表示多行( multiline)模式,即在达到一行文本末尾时还会继续查找下一行中是否存在与模式匹配的项。

        因此,一个正则表达式就是一个模式与上述3个标志的组合体。不同的组合产生不同的结果,如下面的例子所示:

  1. /*
  2. *匹配字符创中所有"at"的实例
  3. */
  4. var pattern1=/at/g;
  5. /*
  6. *匹配第一个"bat"或"cat",不区分大小写
  7. */
  8. var pattern2=/[bc]at/i;
  9. /*
复制代码


        与其他语言中的正则表达式类似,模式中使用的所有元字符都必须转义。正则表达式的元字符包括:( { [ \ ^ $ | ) ? * + . ] } 
        这些元字符在正则表达式中都有一或多中特殊用途,因此如果想要匹配字符串中包含发的这些字符,就必须对它们进行转义。下面给出几个例子:

  1. /*
  2. *匹配第一个"bat"或"cat",不区分大小写
  3. */
  4. var pattern1=/[bc]at/i;
  5. /*
  6. *匹配第一个"[bc]at",不区分大小写   PS:需要多方括号进行转义
  7. */
  8. var pattern2=/\[bc\]at/i;
  9. /*
  10. *匹配所有以"at"结尾的3个字符的组合,不区分大小写
  11. */
  12. var pattern3=/.at/gi;
  13. /*
  14. *匹配所有".at",不区分大小写   PS:需要对句点进行转义
  15. */
  16. var pattern4=/\.at/gi;
复制代码


        前面的这些例子,都是以字面量形式来定义的正则表达式。另一种创建正则表达式的方式是使用RegExp构造函数,它接受两个参数:一个是匹配的字符串模式,二是可选的标志字符串。可以使用字面量定义的任何表达式,都可以使用构造函数来定义,如下面的例子所示:

  1. /*匹配第一个"bat"或"cat",不区分大小写*/
  2. var pattern1=/[bc]at/i;
  3. /*与pattern1相同,但是使用构造函数创建的*/
  4. var pattern2=new RegExp("[bc]at","i");
复制代码


        这里,pattern1hepattern2是两个完全相同的正则表达式。需要注意的,传递给RegExp构造函数的两个参数都是字符串(不能把正则表达式字面量传递给RegExp构造函数)。由于RegExp构造函数的模式参数是字符串,所以在某些情况下要对字符串进行双重转义。所有元字符都必须双重转义,那些已经转义过的字符串也是如此,例如\n(字符\在字符串中通常被转义为\\,而在正则表达式字符串中就会变成\\\)。下表给出了一些模式,左边是这些字面量形式,右边是使用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构造函数创建的正则表达式不一样。在ECMAScript 3 中,正则表达式字面量始终会共享同一个RegExp实例,而使用构造函数创建的每一个新的RegExp实例都是一个新的实例,来看下面的例子:

  1. var re=null,i;
  2. for(i=0;i<10;i++)
  3. {
  4.         re=/cat/g;
  5.         re.test("catastrophe");
  6. }
  7. for(i=0;i<10;i++)
  8. {
  9.         re=new RegExp("cat","g");
  10.         re.test("catastrophe");
  11. }
复制代码


        在下一个循环中,即使是循环体中指定的,但实际上只是为/cat/创建了一个RegExp实例。由于实例属性(下一节介绍实例属性)不会重置,所以在循环中再次调用test()方法会失败。这是因为第一次调用test()找到了”cat“,但是第二次调用是从索引为3的字符(上一次匹配的末尾)开始的,所以就找不到它了。由于会测试到字符串末尾,所以下一次在调用test()就有从头开始了。
        第二个循环使用RegExp构造函数在每次循环中创建正则表达式。因为每次迭代都会创建一个新的RegExp实例,所以每次调用test()都会返回true。

        ECNAScript 5 明确规定,使用正则表达式字面量必须像直接调用RegExp构造函数一样,每次都创建新的RegExp实例。IE9+、FF4+和Chrome都据此做出了修改。

        注:我是小小白,欢迎各位大神指出文中不对的地方^_^~~

posted @ 2015-05-14 21:16  杨潇love  阅读(155)  评论(0编辑  收藏  举报