js中使用正则表达式(五)特殊字符、匹配模式、捕获组与反向引用介绍

1、方括号
方括号用于查找某个范围内的字符:
表达式 描述
[abc] 查找方括号之间的任意一个字符,不是多个。
[^abc] 查找任何不在方括号之间的任意一个字符,不是多个。
[0-9] 查找任何从 0 至 9 的任意一个数字。
[a-z] 查找任何从小写 a 到小写 z 的任意一个字符。
[A-Z] 查找任何从大写 A 到大写 Z 的任意一个字符。
[A-z] 查找任何从大写 A 到小写 z 的任意一个字符。
[adgk] 查找给定集合内的任意一个字符。
[^adgk] 查找给定集合外的任意一个字符。
(red|blue|green) 查找任何指定的选项。

2、元字符及转义字符
    元字符(Metacharacter)是拥有特殊含义的字符,
    所有元字符包括:([{\^$|?*.+}]),如果想单纯的使用本意,需使用反斜杠转义,
    例如使用$的本意而不是匹配结尾,需要\$,如果匹配模式是字符串,需要用双反斜杠才能起作用,
    如果想使用特殊含义,则直接$,不用反斜杠

    元字符 描述
    .   匹配单个任意字符,除了换行和行结束符。
    |   左右两边表达式之间 "或" 关系,匹配左边或者右边。
        例如:表达式 "Tom|Jack" 在匹配字符串 "I'm Tom, he is Jack" 时,
        匹配结果是:成功;匹配到的内容是:"Tom";
        匹配下一个时,匹配结果是:成功;匹配到的内容是:"Jack"

    ()  用于定义捕获组,可以单独拿到捕获组匹配项,捕获组内的匹配模式也可以被整体修饰。
        例如:  表达式 "(go\s*){3}" 在匹配 "Let's go go go!" 时,
        匹配结果是:成功;匹配到内容是:"go go go"。
        通过正则对象RegExp的构造函数属性取出捕获组匹配项:alert(RegExp.$1)//go 

        表达式 "(¥)(\d+\.?\d*)" 在匹配 "$10.9,¥20.5" 时,
        匹配的结果是:成功;匹配到的内容是:"¥20.5"。
        通过正则对象RegExp的构造函数属性取出捕获组匹配项:alert(RegExp.$1)//¥,alert(RegExp.$2)//20.5

    []  匹配任意包含在[]内的一系列字符中的任意一个,不是多个。
        例如:[f-k]匹配 "f"到"k" 之间的任意一个字母,
             [ab4#]匹配 "a" 或 "b" 或 "4" 或 "#"的任意一个字符

    [^] 匹配任意不包含在[]内的一系列字符中的任意一个,不是多个。
    例如:[^abc]匹配 "a","b","c" 之外的任意一个字符,
         [^A-F0-3]匹配 "A"到"F","0"到"3" 之外的任意一个字符
    n$ 匹配任何结尾为 n 的字符串。
    ^n  匹配任何开头为 n 的字符串。
    ?=n 匹配任何其后紧接指定字符串 n 的字符串。
    ?!n 匹配任何其后没有紧接指定字符串 n 的字符串。
    (?:n)   表示不输出捕获组信息。



    转义字符:
    \w  查找单词字符。
    \W  查找非单词字符。
    \d  查找数字。
    \D  查找非数字字符。
    \s  查找空白字符。
    \S  查找非空白字符。
    \b  匹配单词边界。
        例如:表达式 "\bend\b" 表示匹配end前后的边界,即end前后没有单词,
             在匹配 "weekend,endfor,end" 时,匹配结果是:成功;匹配到的内容是:"end";
             匹配到的位置是:开始于15,结束于18。
             位置4的e前面有k是单词,位置10的d后面有f是单词

    \B  匹配非单词边界。
    \0  查找 NUL 字符。
    \n  查找换行符。
    \f  查找换页符。
    \r  查找回车符。
    \t  查找制表符。
    \v  查找垂直制表符。
    \xxx    查找以八进制数 xxx 规定的字符。
    \xdd    查找以十六进制数 dd 规定的字符。
    \uxxxx  查找以十六进制数 xxxx 规定的 Unicode 字符。

3、量词,修饰匹配次数
    量词  描述
    n+  匹配任何包含至少一个 n 的字符串。相当于 {1,},
        例如:"a+b"可以匹配 "ab","aab","aaab"...

    n*  匹配任何包含零个或多个 n 的字符串。相当于 {0,},
        例如:"\^*b"可以匹配 "b","^^^b"...

    n?  匹配任何包含零个或一个 n 的字符串。相当于 {0,1},
        例如:"a[cd]?"可以匹配 "a","ac","ad","acd"

    n{X}    匹配包含 X 个 n 的序列的字符串。
        例如:"\w{2}" 相当于 "\w\w","a{5}" 相当于 "aaaaa"

    n{X,Y}  匹配包含 X 或 Y 个 n 的序列的字符串。
        例如:"ba{1,3}"可以匹配 "ba"或"baa"或"baaa"

    n{X,}   匹配包含至少 X 个 n 的序列的字符串。
        例如:"\w\d{2,}"可以匹配 "a12","_456","M12344"...

4、贪婪模式与非贪婪模式
    添加修饰匹配次数的量词,默认为贪婪模式,尽可能多地匹配;
    而非贪婪模式,是在修饰匹配次数的特殊符号后再加上一个 "?" 号,则可以使匹配次数不定的表达式尽可能少的匹配。

    例如:/(d)(\w+)/表示"\w+" 将匹配第一个 "d" 之后的所有字符 "xxxdxxxd",尽可能多的匹配,贪婪模式
        /(d)(\w+?)/表示"\w+?" 将尽可能少的匹配第一个 "d" 之后的字符,
        结果是:"\w+?" 只匹配了一个 "x",尽可能少的匹配,非贪婪模式

5、捕获组与反向引用
    捕获组:用元字符()表示,小括号包含的表达式所匹配到的字符串可以通过RegExp的构造函数属性单独获取,
    在实际应用场合中,当用某种边界来查找,而所要获取的内容又不包含边界时,必须使用小括号来指定所要的范围。比如前面的 "<td>(.*?)</td>"。
    反向引用:小括号包含的表达式所匹配到的字符串不仅是在匹配结束后才可以使用,
            在匹配过程中也可以使用,表达式后边的部分,可以引用前面小括号内的子匹配已经匹配到的字符串。
            引用方法是 "/" 加上一个数字。"/1" 引用第1对括号内匹配到的字符串,
            "/2" 引用第2对括号内匹配到的字符串……以此类推,
            如果一对括号内包含另一对括号,则外层的括号先排序号。换句话说,哪一对的左括号 "(" 在前,那这一对就先排序号。


    举例1:
        表达式 /('|")(.*?)(\1)/ 
        匹配模式说明:
            第一个捕获组表示匹配一个单引号或双引号,
            第二个捕获组表示匹配任意一个字符至少0个,问号表示的是采用非贪婪模式,
            第三个捕获组表示反向引用第一个捕获组,即匹配一个单引号或双引号

            在匹配 "'Hello', \"World\"" 时(需将内部双引号转义),匹配结果是:成功;
            匹配到的内容是:'Hello'。再次匹配下一个时,可以匹配到 "World"。

    举例2:
        表达式 /(\w)\1{4,}/ 
        匹配模式说明:第一个捕获组表示匹配一个单词字符,然后使用\1反向引用第一个捕获组,同样表示匹配一个单词字符,
        又通过后面的数量{4,},约束至少4个,
        整个匹配模式就是匹配第一个单词字符+后面4个单词字符,至少5个单词字符,如果存在则成功。
        在匹配 "aa bbbb abcdefg ccccc 111121111 999999999" 时,匹配结果是:成功;匹配到的内容是 "ccccc"。

    举例3:
        表达式 /<(\w+)\s*(\w+(=('|").*?\4)?\s*)*>.*?</\1>/ 
        匹配模式说明:
            表达式中有4个捕获组:(\w+)、(\w+(=('|").*?\4)?\s*)、(=('|").*?\4)、('|"),
            反向引用使用了两次,第一次反向引用捕获组4,第二次反向引用捕获组1,
            整个模式含义:  1、匹配一个左尖括号
                    2、第一个捕获组,匹配单词字符1到多个
                    3、匹配空白字符,0到多个
                    4、进入第二个捕获组,先匹配单词字符1到多个
                    5、进入第三个捕获组,先匹配一个=号
                    6、进入第四个捕获组,匹配一个单引号或一个双引号
                    7、然后第三个捕获组继续匹配,匹配任意字符0到多个,采用非贪婪模式,尽量少匹配
                    8、然后反向引用第四个捕获组的结果,即执行第6步的结果
                    9、回到第二个捕获组继续匹配,?表示第三个捕获组匹配的结果个数为0或1个,然后再匹配一个空白字符0到多个
                    10、而第二个捕获组匹配的结果个数为0到多个
                    11、然后匹配一个右尖括号,后面是一个任意字符个数为0到多个,采用非贪婪模式,
                        尽量少匹配,再后面是一个左尖括号和正斜杠
                    12、正斜杠后面反向引用第一个捕获组的结果,即执行第二步的结果
                    13、最后是一个右尖括号

        在匹配 "<td id='td1' style="bgcolor:white"></td>" 时,匹配结果是成功。
        如果 "<td>" 与 "</td>" 不配对,则会匹配失败;如果改成其他配对,也可以匹配成功。

6、普通字符串

参照:http://blog.csdn.net/zaifendou/article/details/5746988

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值