• DOM笔记(十):JavaScript正則表達式


    一、RegExp

    ECMAScript通过RegExp类型类支持正則表達式,语法和Perl类似:

    var exp = /pattern/flags;

    patternb部分是不论什么简单的或复杂的正則表達式;flags是每一个正則表達式所带的一个或者多个标志。

    正則表達式的模式匹配支持三个标志:

    g:全局模式,即模式应用于整个字符串。而非在发现第一个匹配项时马上停止

    i:不区分大写和小写模式

    m:多行模式,即到达一行文本末尾是还会继续茶查找下一行中是否存在与模式匹配的项。

    1、创建正則表達式

    JavaScript创建正则表示有两种方式:字面量创建和RegExp对象创建。

    //字面量创建
    var pattern1 = /[bc]at/i;
    var pattern2 = /[bc]at/ig;
    
    //RegExp对象创建
    var pattern3 = new RegExp("[bc]at","i");  //与pattern1等效
    var pattern4 = new RegExp("\[bc\]at","ig");  //与pattern2等效

     

    二者的差别有两个方面:对特殊字符的转换方式和实例创建。

    RegExp构造函数的模式參数是字符串。所以须要对特殊字符进行双重转义。差别例如以下:

    /w\hello/

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

    在ECMAScript 3中。字面量形式共享一个RegExp实例。而构造函数的每一个实例都不同

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

     

    在低版本号浏览器中,如IE6,对于第一个循环仅仅弹出一次true,其余是false。第二个循环都弹出true。

    在ECMAScript 5中规定:使用正則表達式字面量跟使用RegExp构造函数一样。每次调用都创建新的实例。所以两个循环在现代浏览器中都弹出true。

    2、RegExp实例属性

    属性 说明
    global 布尔值,是否设置了g标志
    ignoreCase 布尔值,是否设置了i标志
    multiline 布尔值,是否设置了m标志
    lastIndex 整数,下一次匹配開始的字符位置
    source 正則表達式的字符串表示

      3、方法

    经常使用的方法有两个:exec()和test(),均接受一个字符串參数

    若存在匹配项,exec()返回一个数组,数组有两个额外的属性:index和input。

    index表示匹配项在字符串中的位置,input表示源字符串。即exec()的參数

    在数组中,第一项是与整个模式匹配的字符串,其它项则与捕获组匹配(若没有捕获组,则仅仅包括一项)。

    不存在匹配项。exec()返回null。

    test()表示字符串中是否存在匹配项,存在返回true,不存在返回false。

    var text = "mom and dad and bady";
    var pattern = /mom( and dad( and bady)?

    )?/gi; var matches = pattern.exec(text); alert(matches.length); //3 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()始终返回第一个匹配项的信息;若设置了全局标志g,每次调用exec()则从上次匹配的位置处继续查找字符串。

    二、String类型

    String类型是字符串的对象包装类型,与Number、Boolean等一样(DOM笔记(九):引用类型、基本包装类型和单体内置对象 ),也能够用new来创建字符串。模式匹配在字符串处理中是非常实用的,String类型也定义了多个与其相关的方法。

    match(pattern):pattern是一个字面量正則表達式或RegExp对象。本质上和exec()方法一样。

    var text = "cat,bat,sat,fat";
    var pattern = /.at/;
    var matches = text.match(pattern);
    //var matches = pattern.exec(text);
    alert(matches.index);
    alert(matches[0]);
    alert(pattern.lastIndex);

     

    search(pattern):參数和match()同样,从开头開始查找。返回第一个匹配项的索引,若没有匹配项,返回-1

    var text = "cat,bat,sat,fat";
    var pos = text.search(/at/);
    alert(pos);   //1

     

    replace(oldstring,newstring):用newstring替换oldstring。第一个字符串能够是一个模式对象,第二个字符串能够结合捕获组使用,或者是一个函数。

    var text = "cat,bat,sat,fat";
    var pattern = /(.at)/g;
    var re = text.replace(pattern,"word($1)");
    alert(re);  //word(cat),word(bat),word(sat),word(fat)

    假设模式中没有捕获组,则用空字符串取代。

      若第二个參数是函数,则该函数接收三个參数:模式匹配项、模式匹配项在字符串中的位置和原始字符串。

    function htmlEscape(text)
    {
        return text.replace(/[<>"&]/g,function(match,pos,text)
            {
                switch(match)
                {
                    case "<":
                        return "&lt;";
                    case ">":
                        return "&gt;";
                    case "&":
                        return "&amp;";
                    case """:
                        return "&quot;";
                }
            });
    }
    //返回:&lt;p class=&quot;greeting&quot;&gt;helloWorld&lt;/p&gt;
    alert(htmlEscape("<p class="greeting">helloWorld</p>"));

     

    若正則表達式中定义了多个捕获组,则传递给函数的依次是匹配项、第一个捕获组、第二个捕获组。。

    。。最后两个參数不变。

    split(string[,limit]):分隔字符串,返回一个数组。

    string能够是一个普通的字符串,也能够是一个模式匹配对象。可选的limit表示返回数组的大小

    var colorText = "red,blue,yellow,black";  
    alert(colorText.split(","));   //[red,blue,yellow,black]
    alert(colorText.split(",",2));  //[red,blue]
    alert(colorText.split(/W/));  //[red,blue,yellow,black]

     

    三、正則表達式的规则

    字符

    说明

    将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。比如,“n”匹配字符“n”。

    “ ”匹配一个换行符。序列“\”匹配“”而“(”则匹配“(”。

    ^

    匹配输入字符串的開始位置。

    假设设置了RegExp对象的Multiline属性。^也匹配“ ”或“ ”之后的位置。

    $

    匹配输入字符串的结束位置。

    假设设置了RegExp对象的Multiline属性,$也匹配“ ”或“ ”之前的位置。

    *

    匹配前面的子表达式零次或多次。比如,zo*能匹配“z”以及“zoo”。

    *等价于{0,}。

    +

    匹配前面的子表达式一次或多次。

    比如,“zo+”能匹配“zo”以及“zoo”。但不能匹配“z”。

    +等价于{1,}。

    ?

    匹配前面的子表达式零次或一次。比如,“do(es)?”能够匹配“do”或“does”中的“do”。?等价于{0,1}。

    {n}

    n是一个非负整数。

    匹配确定的n次。比如,“o{2}”不能匹配“Bob”中的“o”。可是能匹配“food”中的两个o。

    {n,}

    n是一个非负整数。至少匹配n次。比如,“o{2,}”不能匹配“Bob”中的“o”。但能匹配“foooood”中的全部o。

    “o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。

    {n,m}

    m和n均为非负整数,当中n<=m。

    最少匹配n次且最多匹配m次。比如,“o{1,3}”将匹配“fooooood”中的前三个o。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。

    ?

    当该字符紧跟在不论什么一个其它限制符(*,+,?,{n},{n,}。{n,m})后面时。匹配模式是非贪婪的。

    非贪婪模式尽可能少的匹配所搜索的字符串。而默认的贪婪模式则尽可能多的匹配所搜索的字符串。

    比如,对于字符串“oooo”,“o+?”将匹配单个“o”,而“o+”将匹配全部“o”。

    .

    匹配除“ ”之外的不论什么单个字符。

    要匹配包含“ ”在内的不论什么字符。请使用像“[. ]”的模式。

    (pattern)

    匹配pattern并获取这一匹配。所获取的匹配能够从产生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中则使用$0…$9属性。要匹配圆括号字符,请使用“(”或“)”。

    (?:pattern)

    匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分是非常实用。比如“industr(?:y|ies)”就是一个比“industry|industries”更简略的表达式。

    (?=pattern)

    正向预查。在不论什么匹配pattern的字符串開始处匹配查找字符串。

    这是一个非获取匹配,也就是说,该匹配不须要获取供以后使用。比如。“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配 “Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后。在最后一次匹配之后马上開始下一次匹配的搜索,而不是从包括预查的字符之后開始。

    (?!pattern)

    负向预查,在不论什么不匹配pattern的字符串開始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不须要获取供以后使用。比如 “Windows(?

    !95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。

    预查不消耗字符。也就是说,在一个匹配发生后,在最后一次匹配之后马上開始下一次匹配的搜索,而不是从包括预查的字符之后開始

    x|y

    匹配x或y。比如,“z|food”能匹配“z”或“food”。“(z|f)ood”则匹配“zood”或“food”。

    [xyz]

    字符集合。

    匹配所包括的随意一个字符。

    比如。“[abc]”能够匹配“plain”中的“a”。

    [^xyz]

    负值字符集合。匹配未包括的随意字符。比如。“[^abc]”能够匹配“plain”中的“p”。

    [a-z]

    字符范围。

    匹配指定范围内的随意字符。比如,“[a-z]”能够匹配“a”到“z”范围内的随意小写字母字符。

    [^a-z]

    负值字符范围。

    匹配不论什么不在指定范围内的随意字符。比如。“[^a-z]”能够匹配不论什么不在“a”到“z”范围内的随意字符。

    

    匹配一个单词边界。也就是指单词和空格间的位置。

    比如,“er”能够匹配“never”中的“er”,但不能匹配“verb”中的“er”。

    B

    匹配非单词边界。“erB”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。

    d

    匹配一个数字字符。等价于[0-9]。

    D

    匹配一个非数字字符。

    等价于[^0-9]。

    s

    匹配不论什么空白字符。包含空格、制表符、换页符等等。等价于[f v]。

    S

    匹配不论什么非空白字符。等价于[^f v]。

    w

    匹配包含下划线的不论什么单词字符。等价于“[A-Za-z0-9_]”

    W

    匹配不论什么非单词字符。等价于“[^A-Za-z0-9_]”。

    f、 、 、 、v

    匹配一个换页符、换行符、回车符、水平制表符、垂直制表符,分别等价于x0c和cL、x0a和cJ、x0d和cM、x09和cI、x0b和cK

    cx

    匹配由x指明的控制字符。比如,cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之中的一个。否则。将c视为一个原义的“c”字符。

    xn

    匹配n,当中n为十六进制转义值。十六进制转义值必须为确定的两个数字长。

    比如,“x41”匹配“A”。

    “x041”则等价于“x04&1”。

    正則表達式中能够使用ASCII编码。

    um

    匹配num,当中num是一个正整数。对所获取的匹配的引用。比如,“(.)1”匹配两个连续的同样字符。

    标识一个八进制转义值或一个向后引用。假设 之前至少n个获取的子表达式。则n为向后引用。

    否则。假设n为八进制数字(0-7)。则n为一个八进制转义值。

    m

    标识一个八进制转义值或一个向后引用。假设 m之前至少有nm个获得子表达式。则nm为向后引用。假设 m之前至少有n个获取,则n为一个后跟文字m的向后引用。假设前面的条件都不满足,若n和m均为八进制数字(0-7),则 m将匹配八进制转义值nm。

    ml

    假设n为八进制数字(0-3),且m和l均为八进制数字(0-7)。则匹配八进制转义值nml。

    un

    匹配n。当中n是一个用四个十六进制数字表示的Unicode字符。比如。u00A9匹配版权符号(?)。

     

    四、常见正則表達式经常使用的正則表達式归纳

    原文首发:http://www.ido321.com/1355.html
  • 相关阅读:
    [BZOJ]2132: 圈地计划 最小割
    从最近MySQL的优化工作想到的
    Linux基本操作 9----- 认识与学习bash
    多路径配置vlome group共享存储,VG的更新。
    两位数乘法的速算方法(一)
    请对他有足够的重视——设计!
    ASP.NET中配置应用程序
    flex开发小技巧集锦
    刚制作完的SAP Sybase ASE15.7 [Sybase Central] 客户端
    Static 关键字的 5 种用法,你会几种?
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/7392319.html
Copyright © 2020-2023  润新知