zoukankan      html  css  js  c++  java
  • JavaScript之RegExp对象

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

    var expression = / pattern / flags ;

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

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

    例子

    /*
    * 匹配字符串中所有"at"的实例
    */
    var pattern1 = /at/g;
    /*
    * 匹配第一个"bat"或"cat",不区分大小写
    */
    var pattern2 = /[bc]at/i;
    /*
    * 匹配所有以"at"结尾的 3 个字符的组合,不区分大小写
    */
    var pattern3 = /.at/gi;
    

     与其他语言中的正则表达式类似,模式中使用的所有元字符都必须转义。正则表达式中的元字符包括:

    ( [ {  ^ $ | ) ? * + .]}

    这些元字符在正则表达式中都有一或多种特殊用途,因此如果想要匹配字符串中包含的这些字符,
    就必须对它们进行转义。下面给出几个例子。

    /*
    * 匹配第一个" [bc]at",不区分大小写
    */
    var pattern2 = /[bc]at/i;
    /*
    * 匹配所有以"at"结尾的 3 个字符的组合,不区分大
    */
    var pattern3 = /.at/gi;
    /*
    * 匹配所有".at",不区分大小写
    */
    var pattern4 = /.at/gi;
    

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

    /*
    * 匹配第一个"bat"或"cat",不区分大小写
    */
    var pattern1 = /[bc]at/i;
    /*
    * 与 pattern1 相同,只不过是使用构造函数创建的
    */
    var pattern2 = new RegExp("[bc]at", "i");
    

     所有元字符都必须双重转义,那
    些已经转义过的字符也是如此,例如 (字符在字符串中通常被转义为\,而在正则表达式字符串中就
    会变成\\)。下表给出了一些模式,左边是这些模式的字面量形式,右边是使用 RegExp 构造函数定义
    相同模式时使用的字符串。

    使用正则表达式字面量和使用 RegExp 构造函数创建的正则表达式不一样。在 ECMAScript 3 中,
    正则表达式字面量始终会共享同一个 RegExp 实例,而使用构造函数创建的每一个新 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的实例属性

    RegExp 的每个实例都具有下列属性,通过这些属性可以取得有关模式的各种信息。

    global:布尔值,表示是否设置了 g 标志。
    ignoreCase:布尔值,表示是否设置了 i
    lastIndex:整数,表示开始搜索下一个匹配
    multiline:布尔值,表示是否设置了 m 标志
    source:正则表达式的字符串表示,按照字面
    通过这些属性可以获知一个正则表达式的各方面
    在模式声明中。例如:

    var pattern1 = /[bc]at/i;
    alert(pattern1.global); //false
    alert(pattern1.ignoreCase); //true
    alert(pattern1.multiline); //false
    alert(pattern1.lastIndex); //0
    alert(pattern1.source); //"[bc]at"
    var pattern2 = new RegExp("\[bc\]at", "i");
    alert(pattern2.global); //false
    alert(pattern2.ignoreCase); //true
    alert(pattern2.multiline); //false
    alert(pattern2.lastIndex); //0
    alert(pattern2.source); //"[bc]at"

    RegExp实例方法

    RegExp 对象的主要方法是 exec(),该方法是专门为捕获组而设计的。 exec()接受一个参数,即
    要应用模式的字符串,然后返回包含第一个匹配项信息的数组;或者在没有匹配项的情况下返回 null

    返回的数组虽然是 Array 的实例,但包含两个额外的属性: index input。其中, index 表示匹配
    项在字符串中的位置,而 input 表示应用正则表达式的字符串。

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

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

    var text = "cat, bat, sat, fat";
    var pattern1 = /.at/;
    var matches = pattern1.exec(text);
    alert(matches.index); //0
    alert(matches[0]); //cat
    alert(pattern1.lastIndex); //0
    matches = pattern1.exec(text);
    alert(matches.index); //0
    alert(matches[0]); //cat
    alert(pattern1.lastIndex); //0
    var pattern2 = /.at/g;
    var matches = pattern2.exec(text);
    alert(matches.index); //0
    alert(matches[0]); //cat
    alert(pattern2.lastIndex); //3
    matches = pattern2.exec(text);
    alert(matches.index); //5
    alert(matches[0]); //bat
    alert(pattern2.lastIndex); //8
    

     正则表达式的第二个方法是 test(),它接受一个字符串参数。在模式与该参数匹配的情况下返回
    true;否则,返回 false。在只想知道目标字符串与某个模式是否匹配,但不需要知道其文本内容的
    情况下,使用这个方法非常方便。因此, test()方法经常被用在 if 语句中,如下面的例子所示。

    var text = "000-00-0000";
    var pattern = /d{3}-d{2}-d{4}/;
    if (pattern.test(text)){
    alert("The pattern was matched.");
    }
    

    RegExp构造函数

  • 相关阅读:
    python学习2(转载)
    python学习1
    第三方授权登录
    新浪微博开发者平台应用申请及配置说明
    新浪微博登录第三方网站实现原理是什么?
    Redis中PipeLine使用
    发送短信验证码的功能开发
    Python celery原理及运行流程
    设置django缓存+验证码图片接口
    编写注册接口
  • 原文地址:https://www.cnblogs.com/leomei91/p/7488977.html
Copyright © 2011-2022 走看看