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都据此做出了修改。

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

5.4 RegExp类型的更多相关文章

  1. 引用类型-RegExp类型

    JavaScript高级程序设计(第三版)笔记-第五章-RegExp类型 定义正则表达式有两种方式 1.用字面量形式定义正则表达式: ver expression = /patterns/flags; ...

  2. RegExp类型exec()方法的返回值说明

    之前看别人写的插件经常会用到RegExp对象来验证输入,并且获取一些那时我并不晓得是什么东西的数组,来取值进行自定义的逻辑处理.今天学习了一下RegExp类型.终于有了一个初步的了解,至少不会看一会就 ...

  3. RegExp类型,单体内置对象

    1.RegExp类型:  1)什么是正则表达式:RegExp    --是一种规则,模式    --强大的字符串匹配工具    --创建:    --使用RegExp构造函数创建:var re=new ...

  4. js中RegExp类型

    ECMAScript通过RegExp类型来支持正则表达式. var expression = / pattern / flag ; pattern可以是任意的正则表达式.每个正则都带有标志,用以正则表 ...

  5. 《JavaScript高级程序设计》读书笔记 ---RegExp 类型

    ECMAScript 通过RegExp 类型来支持正则表达式.使用下面类似Perl 的语法,就可以创建一个正则表达式.var expression = / pattern / flags ; 其中的模 ...

  6. Javascript高级编程学习笔记(15)—— 引用类型(4)RegExp类型

    JS中处理字符串最常用的应该就是正则了 同样正则(RegExp)类型也是JS中引用类型的一种 ECMAScript通过 RegExp类型 来支持正则表达式 创建正则 var expression = ...

  7. 随笔记录--RegExp类型

    阅读Javascript高级程序设计第五章 -- RegExp类型总结 对于基础教程部分, 有小伙伴不熟悉的,可以参考 正则表达式 - 教程 1. 基础部分回顾: ECMASript通过RegExp类 ...

  8. RegExp类型(正则表达式)

    直接量语法 /pattern/attributes 创建 RegExp 对象的语法: new RegExp(pattern, attributes); 一.attributes: 修饰符 描述 i 执 ...

  9. JS RegExp类型

    用来定义正则表达式的类型, 1. 通常情况下,我们可以直接用字面量形式来定义正则表达式,格式如下: var expression = /pattern/flags pattern为正则表达式 flag ...

随机推荐

  1. 使用MD5完成自定义Person对象的加密过程

    ---恢复内容开始--- 首先:我们对自定义Person对象的加密过程所用的方法是归档写入文件的方法. 第一步:创建Person,继承于NSObject,然后在Person.h文件遵守NSCoding ...

  2. 怎样通过css的media属性,适配不同分辨率的终端设备?

    怎样通过css的media属性,适配不同分辨率的终端设备,示比例如以下: <!DOCTYPE html> <html> <head> <title>首页 ...

  3. SQL数据库插入文本信息

    文本内容

  4. 队列的实现 -- 数据结构与算法的javascript描述 第五章

    队列也是列表的一种,有不同于列表的规则. 先进先出 入队方法 出队方法 可以找到队首 可以找到队尾 可以查看队列有多长 可以查看队列是否为空 这是一个基本的需求,围绕他来实现,当然我们可以自己扩展列表 ...

  5. 如何为你的美术妹子做Unity的小工具(一)

    在上的工具栏添加   也就是这个位置

  6. java 中有几种方法可以实现一个线程? 用什么关键字修 饰同步方法? stop()和 suspend()方法为何不推荐使用?

    java5 以前, 有如下两种:第一种:new Thread(){}.start();这表示调用 Thread 子类对象的 run 方法, new Thread(){}表示一个Thread 的匿名子类 ...

  7. 标准模板库——IO库

    IO库设施: . istream(输入流)类型,提供输入操作. . ostream(输出流)类型,提供输出操作. . cin,一个istream对象,从标准输入读取数据. . cout,一个ostre ...

  8. 搭建Hadoop集群 (一)

    上面讲了如何搭建Hadoop的Standalone和Pseudo-Distributed Mode(搭建单节点Hadoop应用环境), 现在我们来搭建一个Fully-Distributed Mode的 ...

  9. 移动前端制作篇之javascript篇

    javascript(简称js)语言在移动前端应用很广.可以说必不可少,许多效果都是和js相关的.包括现在移动端的一些框架.jqmobi.jqtouch.sencha touch.jquerymobi ...

  10. Asp.Net 禁用cookie后使用session

    原文地址:http://www.c-sharpcorner.com/UploadFile/deepak.sharma00/using-cookie-less-session-in-Asp-Net/ H ...