JS - RegExp 笔记

2016-07-12


  var str = "L.Rain"; 
  str = str.replace(/[R|n]/g , "*"); <==> new RegExp("[R|n]","gi")

  RegExp 类。RegExp对象的构造函数可以带一个或两个参数.第一个参数是描述需要进行匹配的模式字符串;如果有第二个参数,这个参数则指定了额外的处理指令.
  最基本的正则表达式就是普通的字符串.
  var reCat = new RegExp("cat");  <==>  var reCat = /cat/;
  var reCat = new RegExp("cat","g"); 第二个参数表示要搜索字符串出现的全部的"cat",而不是找到第一个匹配后就停止。如果还要模式不区分大小写
  ,可以给第二个参数添加字符 i     var reCat = new RegExp("cat","gi");  <==> var reCat = /cat/gi;
  测试: var sToMatch = "cat";
          var reCat = /cat/gi;
          alert( reCat.test(sToMatch) );
  exec():访问模式的每一次出现
              var sToMatch = "a bat , a Cat , a fAt ,a baT , a faT cat";
              var reAt = /at/;
              var arrMatches = reAt.exec(sToMatch);
              alert( arrMatches.length );   // output  1
  match(): String 对象的 match()  方法
              var sToMatch = "a bat , a Cat , a fAt ,a baT , a faT cat";
              var reAt = /at/gi;
              var arrMatches = sToMatch.match(reAt);
              alert( arrMatches.length );   // output  6
  search() : 此方法与 indexOf()方法类似,但是它使用的是一个    RegExp 对象 而并非一个字符串 ,返回的是字符串中一个匹配的位置。(g)全局匹配在此
  方法不起作用。
  replace():可以用另外一个字符串(第二个参数) 来代替某一个字符串 或者 一个匹配的模式字符串 (第一个参数) 的所有匹配
  split(): 参数 可以为一个字符串 也可以为 一个 匹配的模式字符串 RegExp 对象


  /****************************/

  元字符,字符类和量词等都是正则表达式语法中非常重要的部分。

  元字符: (  [  {    ^   $  |  )   ?  *  +  任何时候要使用这些元字符 ,都必须对它们进行转义。因此

      var reQMark =/?/ ;
      <==>
      var reQMark = new RegExp("\?");  注意此处为 \   Javascript高级程序设计 P170

      使用特殊字符:      (换行符)     (回车符)    f    a   e    cX        v    (空字符)
                  var sNewString = sStringnewlines.replace(/ /g,"")
                  如果通过  RegExp  构造函数来使用它们 , 则都必须进行双重转义.
        字符类: 简单类 : 是用于测试的字符的组合.通过将一些字符放入括号中。 例如要匹配字符a,b,c应该为[abc], 这个称之为简单类。
   var sToMatch = "a bat , a Cat , a fAt ,a baT , a faT cat";
   var reBatCatRat =/[bcf]at/gi;
   var arrMatches = sToMatch.match(reBatCatRat);
   document.write(arrMatches);   //bat,Cat,fAt,baT,faT,cat
   负向类 : 除了特定的一些,你可能会要匹配所有的字符, 则可以使用负向类。 例如要匹配除了a和b的所有字符,那么应该为[^ab]
   var sToMatch = "a bat , a Cat , a fAt ,a baT , a faT cat";
   var reBatCatRat =/[^bc]at/gi;
   var arrMatches = sToMatch.match(reBatCatRat);
   document.write(arrMatches);   //fAt,faT
   范围类 :  要匹配所有的字母表中的字符,但是又实在不想逐个输入。 例如指定从a到z之间范围:[a-z]。那条横线可看作为"从什么到什么"
   组合类 : 是由几种其他的类组合而成的字符类.例如 假设要匹配所有的从a~m的字母以及从1~4的数字,以及以个换行符。
                    [a-m1-4 ] 注意 不要有空格。
                    在 ECMAScript 不支持联合类和交叉类 如:[a-m[p-z]  [a-m[^b-e]]之间的模式出现
   预定义类 :   .  <=>  [^ ]   除了换行符和回车之外的任意字符
               d  <=>  [0-9]     任意数字
               D     <=>  [^0-9]    非数字字符
               s  <=>     [ x0Bf ]  空白字符
               S  <=>     [^ x0Bf ]  非空白字符
               w  <=>  [a-zA-Z_0-9]     单词字符(所有的字母,数字,下划线)
               W  <=>  [^a-zA-Z_0-9]    非单词字符
         量词 : 可以指定某个特定模式出现的次数
      ?      出现0或1次
      *         出现0或多次
      +         出现1次或多次   最少一次
      {n}    一定出现n次
      {n,m}  至少出现 n 次 但不超过 m次
      {n,}   至少出现 n 次
复杂模式
分组:
 var reg = /[.]*?play-(.*?).html$/;
var str = "http://www.openv.com/zj/zj_play-sport_2008_2017.html";
reg.test(str);
document.write(RegExp.$1);     //output sport_2008_2017

贪婪、惰性 和 支配性 (目前IE.Opera不支持)的量词  ☆
贪婪量词: 先看整个的字符串是否匹配.如果没有发现匹配的,它去掉该字符串的最后一个字符,并再次尝试。如果还没有发现匹配,那么再次去掉最后一个字符
这个过程一直重复直到发现一个匹配或者字符串不剩任何字符。
惰性量词: 先看字符串的第一个字母是否匹配。如果单独这一个字符还不够,就读入下一个字符, 组成两个字符的字符串.如果还没有匹配,惰性量词将继续从
字符串中添加字符直到发现匹配或整个字符串都检查过也没有匹配。刚好与贪婪量词相反。
支配量词:只尝试匹配整个字符串。如果整个字符串不能产生匹配,不做进一步的尝试。支配量词就是一刀切,
贪婪: ?      *       +
惰性: ??     *?      +?
支配: ?+     *+      ++