溫故知新 javascript Regex之二:javascript Regex是分組知識

來源:互聯網
上載者:User

二  javascript  Regex是分組知識

 

 

1) 簡單分組

<script language="JavaScript">
  <!--
    /*Regex  簡單的分組
    舉例 我們要尋找字串 MouseMouse

    var reCat = /MouseMouse/gi;
   
    儘管這是可以的,但是有點浪費。如果不知道Mouse 在字串中到底出現幾次時該怎麼辦,如果重複多次呢。
    var reCat = /(mouse){2}/gi;    括弧的意思列Mouse 將在一行連續出現2次。

    */ 
   
    var data = "Ah-mousemouse"; 
    var reCat = /(mouse){2}/gi;  
    var arrdata = data.match(reCat);

    for (var i = 0; i < arrdata.length; i++)
    {
        alert(arrdata[i]);
    }   
   

  //-->
  </script>

 

2 複雜分組

 

<script language="JavaScript">
  <!--
    /*Regex  複雜的分組
         ?   零次 或 一次
    *   零次 或 多次
    +   最少一次 或 多次
    */ 
   
    var data = "bb ba da bad dad aa "; 
    var reCat = /([bd]ad?)/gi;   // 匹配出 ba da bad  dad
    var arrdata = data.match(reCat);

    for (var i = 0; i < arrdata.length; i++)
    {
        alert(arrdata[i]);
    }   
   

    // 同時 也不介意將分組放在分組中間
    // var re = /(mom( and dad)?)/;    匹配出 mom  或  mon and daa
  //-->
  </script>

 

3   反向引用

<script language="JavaScript">
  <!--
    /*Regex  反向引用*/

    var sToMatch = "#123456789";
    var reNumbers = /#(/d+)/;
    reNumbers.test(sToMatch);
    alert(RegExp.$1);

    /*
      這個例子嘗試匹配後面跟著幾個或多個數位鎊符合,並對數字進行分組
      以儲存他們。在調用 test 方法後,所有的反向引用都儲存到了 RegExp 建構函式中
      從 RegExp.$1(它儲存了第一個反向引用)開始,如果還有第二個反向引用,就是
      RegExp.$2,如果還有第三個反向引用存在,就是 RegExp.$3.依此類推。因為該組
      匹配了 “123456780”,所以 RegExp.$1 中就儲存了這個字串。

    */

    var sToChange = "1234 5678";
    var reMatch = /(/d{4}) (/d{4})/;
    var sNew = sToChange.replace(reMatch,"$2 $1");
    alert(sNew);

    /*
      在這個例子中,Regex有兩個分組,每一個分組有四個數字。在 replace() 方法的第二個參數
      中,$2 等同於 “5678” ,而 $1 等同於 “1234”,對應於它們在運算式中的出現順序。
    */

  //-->
  </script>

4 候選

 <script language="JavaScript">
  <!--
    /*Regex  候選 */
    var sToMatch1 = "red";
    var sToMatch2 = "black";
    var reRed = /red/;
    var reBlack = /black/;

    alert(reRed.test(sToMatch1) || reBlack.test(sToMatch1));
    alert(reRed.test(sToMatch2) || reBlack.test(sToMatch2));

    /*
     這雖然能完成任務,但是十分沉長,還有另一種方式就是Regex的候選操作符。
    */

    var sToMatch1 = "red";
    var sToMatch2 = "black";
    var reRedOrBlack = /(red|black)/;
    alert(reRedOrBlack.test(sToMatch1));
    alert(reRedOrBlack.test(sToMatch2));

  //-->
  </script>

  5  非捕獲性分組

  <script language="JavaScript">
  <!--
    /*Regex  非捕獲性分組
   
    如果要建立一個非捕獲性分組,只要在左括弧的後面加上一個問號和一個緊跟的冒號:
    */

    var sToMatch = "#123456789";
    var reNumbers = /#(?:/d+)/;
    reNumbers.test(sToMatch);
    alert(RegExp.$1);

    /*
    這個例子的最後一行代碼輸出一個Null 字元串,因為該組是非捕獲性的,
    */

    var sToMatch = "#123456789";
    var reNumbers = /#(?:/d+)/;
    alert(sToMatch.replace(reNumbers,"abcd$1"));

    /*
    正因如此,replace()方法就不能通過 RegExp.$x 變數來使用任何反向引用,這段代碼
    輸出的“abcd$1”而不是abcd123456789, 因為$1 在這裡並不被看成是一個反向引用。
    */
  //-->
  </script>

  6 前瞻

  <script language="JavaScript">
  <!--
    /*Regex  前瞻
    前瞻 就和它名字一樣,它告訴Regex運算器向前看一些字元而不是移動位置
    */

      var sToMatch1 = "bedroom";
      var sToMatch2 = "bedding";
      var reBed = /bed(?=room)/;
      alert(reBed.test(sToMatch1));  //true
      alert(reBed.test(sToMatch2));  //false
  
    //負向前瞻
   
      var sToMatch1 = "bedroom";
      var sToMatch2 = "bedding";
      var reBed = /bed(?!room)/;
      alert(reBed.test(sToMatch1)); //false
      alert(reBed.test(sToMatch2)); //true
  //-->
  </script>

  7 邊界

   <script language="JavaScript">
  <!--
    /*Regex  邊界
    ^     行開頭
    $     行結尾
    /b    單詞的邊界
    /B    非單詞的邊界
    */

      var sToMatch = "Important word is the last one.";
      var reLastWord = /(/w+)/.$/;
      reLastWord.test(sToMatch);
      alert(RegExp.$1);  //one

    /*
    假如想尋找一個單詞,但要它只出現在行尾,則可以使用貨幣符號 ($)來表示它:
    */

 

      var sToMatch = "Important word is the last one.";
      var reLastWord = /^(/w+)/;
      reLastWord.test(sToMatch);
      alert(RegExp.$1);  //Important

    /*
    在這個例子中,Regex尋找行起始位置後的一個或多個單詞字元。如果遇到非單詞字元
    匹配停止,返回 Important。 這個例子也可以用單詞邊界實現。
    */
  
      var sToMatch = "Important word is the last one.";
      var reLastWord = /^(.+?)/b/;
      reLastWord.test(sToMatch);
      alert(RegExp.$1);  //Important
   
    /*
    這裡,Regex用惰性量詞來制定在單詞邊界之前可以出現任何字元,且可以出現一次或
    多次(如果使用貪婪性量詞,運算式就匹配整個字串)。
    */

    var data = " First second thind fourth fifth sixth "; 
    var reCat = //b(/S+?)/b/g;  
    var arrdata = data.match(reCat);

    for (var i = 0; i < arrdata.length; i++)
    {
        alert(arrdata[i]);
    }  

    /*
    使用單詞邊界可以方便地從字串中抽取單詞。
    */
  //-->
  </script>

  8 多行模式

     <script language="JavaScript">
  <!--
    /*Regex  多行模式
  
      要制定多行模式,只要在Regex想要匹配的行末的一個單詞
    */ 
   
    var data = " First second/n thind fourth/n fifth sixth"; 
    var reCat = /(/w+)$/g;  
    var arrdata = data.match(reCat);

    for (var i = 0; i < arrdata.length; i++)
    {
        alert(arrdata[i]);
    } 
   
    /*
      上面只返回一個單詞 sixth,因為分行符號阻擋了匹配,只能匹配行末的一個單詞,
    當然也可以使用 split() 方法將字串分割成數組,但就得對每一行進行單獨匹配。

    以前不好好看書經常半吊子,看一半就仍了,導致用了好多 split, 其實很簡單如下面
    例子 只需要 m 參數進行多行匹配。

    */ 
    var data = " First second/n thind fourth/n fifth sixth"; 
    var reCat = /(/w+)$/gm;  
    var arrdata = data.match(reCat);

    for (var i = 0; i < arrdata.length; i++)
    {
        alert(arrdata[i]);
    } 
   

  //-->
  </script>

  至此結束,這些都是 javascript Regex的基本方法,如果你看會了看複雜的正則你會有豁然開朗的感覺。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.