JavaScript正则表达式总结

来源:互联网 发布:redis mysql 对比 编辑:程序博客网 时间:2024/05/01 17:33
  JavaScript正则表达式总结

一、RegExp对象和字面量
     RegExp对象构造方式:
     var re = new RegExp("cat");
     var re = new RegExp("cat","gim");
     g:global,表示找到所有的匹配,如果不指定g选项,只匹配第一个
     i:不区分大小写
     m:匹配多行
     字面量方式:
     var re = /cat/;
     var re = /cat/gi;
     两者区别:
     非字面量来表达正则表达式时,对元字符转义必须用双重转义,而字面量不用,eg:
     var re = //?/; // ?为元字符必须转义
     var re = new RegExp('//?'); // 因为RegExp是用字符串来构造,而/必须也转义,故得写成 '//?'
二、简单模式
     1、元字符
          (、[、{、/、^、$、|、)、?、*、+、.
     2、使用特殊字符
          用ascii码和unicode表示字符
          /t   制表符
          /n   换行符
          /r   回车符
          /f   换页符
          /a   alert字符
          /e   escape字符
          /cX   与X相对应的控制字符
          /b   回退字符
          /v   垂直制表符
          /0   空字符
          以上特殊字符用非字面量方式构造表达式时,要双重转义
     3、字符类
         简单类:[]来表示单个字符有或的关系,如/[bc]/,匹配b或者c
         负向类:^来表示不匹配后面跟着的字符,如/[^bc],/不匹配b或c
         范围类:-来表示一个范围,如/[a-z]/,匹配a-z的字母,可以和负向类结合/^0-9/
         组合类:以上几种类组合而成的字符类,如/a-z0-9/n/,匹配a-z的字母或者0-9的数字或者换行符
         类不能嵌套,就是不支持联合类和交叉类,/a-m[p-z]/和/a-m[^b-e]/在JavaScript中是非法的
         预定义类:
         .    =    [^/n/r]   除了换行和回车之外的任何字符
         /d  =    [0-9]      数字
         /D  =    [^0-9]   非数字
         /s  =     [ /t/n/x0B/f/r]   空白字符
         /S  =    [^ /t/n/x0B/f/r]   非空白字符
         /w  =    [a-zA-Z_0-9]     单词字符(字母、数字、下划线)
         /w  =    [^a-zA-Z_0-9]     非单词字符
     4、量词:某个模式出现的次数
         简单量词:
         ?   出现0或1次
         *   出现0或多次
         +   出现1或多次(至少1次)
         {n}   =n次
         {n,m}   >=n,<=m
         {n,}     >=n
         贪婪量词:先匹配整个字符串,如果不匹配则去掉最后一个字符再匹配,直到没有任何字符。所有简单量词都是贪婪的。
         惰性量词:和贪婪量词相反,即先匹配第一个字符,不匹配则匹配第一第二个字符,直到最后整个字符串。所有简单量词后面加?就是惰性的了。
         支配量词:只匹配整个字符串一次,不匹配就结束。所有简单量词后面加+就是支配的了。
三、复杂模式
     1、分组:用括号来包括一些字符、字符类、量词来使用的。个人理解为可以将字符、字符类、量词等用括号来组成一个单元,可以对这个单元使用量词,同时这个单元是被存储起来的。分组可以嵌套。
     2、反向引用:每个分组都是被存储起来的,存储在分组中的匹配值称为反向引用。
         使用正则表达式的test、match、search方法之后,可以通过正则表达式的实例变量来访问到反向引用。RegExp.$1,RegExp.$2...来访问反向引用。
         可以直接在分组表达式中使用分组。eg:var re = /dog/1/,转义/1就引用了第一个反向引用
         可以在String的replace方法中通过特殊的序列$1、$2来访问反向引用。eg:var sToChange = '1234 5678';var reMatch = /(/d{4}) (/d4)/;var sNew = sToChange.replace(reMatch,'$2 $1');很轻松的实现单词的顺序转换。
     3、候选:用|来表示模式的或关系。
     4、非捕获性分组:创建反向引用的分组是捕获性分组,不创建反向引用的分组就是非捕获性分组。eg:(?:bad)
     5、前瞻:某个特定的字符分组出现在另一个字符串之前时才捕获,正向前瞻要放在(?=和)之间(不是分组),负向前瞻放在(?!和)之间。eg:/ (bed(?=room))/匹配跟在room前面的bed;/(bed(?!room))/匹配不跟在room前的bed。
     6、边界:^行开头,$行结尾,/b单词边界,/B非单词边界。
     7、多行模式:m选项打开,能影响^和$,使^匹配开头和换行符后面的位置,$匹配真正的结尾和换行符。