JavaScript系列----正則表達式

1.正則表達式

  • 1.1.正則表達式的類型

    正則表達式在JavaScript中,提供了一種內置的構造函數--RegExp.

    正則表達式有三種匹配模式:正則表達式

    • g: 表示全局模式,即模式應用於全部的字符串,而非發現第一個符合條件的字符串中止。
    • i:  表示字符串匹配的時候忽略(ingnore)字符串的大小寫。
    • m: 表示多行(multiline)模式,即在達到一行的末尾時,肯定是否要接着匹配下一行。
  • 1.2.正則表達式建立


    正則表達式的兩種建立方式:
    • 面向字面量
      字面量方式建立字符串比較簡單,以下所示
      var reg=/bt/gim;  ----註釋: /bt/ 兩個斜槓中表示的是匹配項。而 gim表示匹配模式,g i m 三種匹配模式能夠寫一種或幾種,也能夠不寫。
    • 構造函數
      構造函數以下所示
      var reg=new RegExp("bt","gim");//---註釋 第一個參數是字符串匹配項,第二種表示匹配模式。

       兩種方式在初始化正則表達式的時候所得的結果,幾乎相同。除了一點----- 第二種在出現元字符的時候須要轉義.數組

  • 1.3.元字符

  • 正則表達式的元字符均須要轉義:函數

    ( [ { \ ^ $ | ) ? * + .] } 這14中字符在表示的時候均與要轉義,由於他們在正則表達式中均有其本身的含義。spa

       關於正則表達式的匹配項的意義,這裏只列舉比較少見的幾種。詳情參見----正則表達式語法  code

     

    • x|y  ------表示匹配X或者Y。例如,'z|food' 匹配「z」或「food」。'(z|f)ood' 匹配「zood」或「food」。
    • (?:x|y)---表示匹配X或者Y,可是過濾掉子選擇項。這兩種列舉出來主要是是區分和上一種的區別。
        
      /* 第一種演示(X|Y)*/
      var str = 'iam007'; var reg = /^([a-z]|\d)/; //匹配以數字或者是字母開頭的字符串 var result = reg.exec(str); console.log(result[1]); //---結果:i


      /*第二種 演示(?:X|Y)*/

      var str = 'iam007';
      var reg = /^(?:[a-z]|\d)/;
      var result = reg.exec(str);
      console.log(result[1]);    //undefinedregexp

       

    • (?=pattern)-----表示匹配從pattern開始向後搜索,而且根據pattern不佔位置,而且下次匹配是從該位置開始的。
      var str = 'iam007';
      var reg = /(?=[a-z])(\w)/g; var result = reg.exec(str); while (result && result.length) { console.log(result[1]); result = reg.exec(str); } //第一次匹配從i開始,第二次匹配從a開始,第三個匹配從m開始,第四次則無匹配項,輸出結果 :----i a m;
    • (?!pattern)-----!pattern表示第一個與pattern不匹配的項,該匹配也是非捕獲類型的。並且,下次匹配是從這個pattern位置開始的。
      var str = 'iam007';
      var reg = /(\w)(?![a-z])\d/g; var result = reg.exec(str); while (result && result.length) { console.log(result[1]); result = reg.exec(str); } // 輸出結果 ---- m 0 第一次匹配(m00),第二次匹配(007).第三次無匹配項。

2.RegExp的屬性

  • 2.1.RegExp的屬性

    RegExp的每一個實例都有下列屬性,經過這些屬性能夠獲得正則表達式的各類信息。blog

    • global: 布爾值,表示是否設置了g標誌。----只讀屬性
    • ignoreCase:布爾值,表示是否設置了i標誌。----只讀屬性
    • lastIndex:整數,表示開始搜索下一個匹配項的字符位置,從0開始。 ----能夠讀和寫(但有侷限性)
    • multiline:布爾值,表示是否設置了m標誌。-----只讀屬性
    • source:正則表達式的字符串表示。            -----只讀屬性

    這些屬性,雖然包含在模式生命中,可是沒有很大的做用,除了lastIndex外(只在global=true時更改纔有效,當global=false時,即便更改,也是從index=0位置處開始搜索),其他的都不可更改,下面咱們舉個例子來講明lastIndex的用處。ip

    var reg = /\w/g;
    var str = 'abcdefg';
    var result = reg.exec(str);
    while (result && result.length) {
      console.log(result[0]);
      reg.lastIndex=reg.lastIndex+1;
      result = reg.exec(str);
    }//跳躍查詢,實用處也不大。

 

  • 2.2.RegExp構造函數屬性

    RegExp構造函數有一些屬性,請同RegExp實例的屬性進行比較,講着兩部分主要是爲了引出下一小節的內容。字符串

    長屬性名 短屬性名 說明
    input $_ 最近一次要匹配的字符串
    lastMatch $& 最近一次匹配項(opera未實現此屬性)
    leftContext $` input字符串被匹配項以前的文本
    multiline $* 是否全部表達式都使用多行模式。IE和Opera還沒有實現
    rightContext $' input字符串被匹配項以後的文本
    lastParen $+ 最近一次的捕獲組.Opera未實現

       補充屬性:  $+數字,表示被小括號捕獲的項。get

     

     這些值,能夠從exec()和test()中提取出具體信息。----注:此正則表達式實例必須是字面量形式建立,才能夠訪問。

    var text = 'hello world';
    var reg = /\s/g;  //匹配中間的空格 var result = reg.exec(text);
    for (var property in RegExp) {
      console.log('RegExp[' + property + ']=' + RegExp[property]);
    }
    //輸出結果
    RegExp[input]=hello world
    RegExp[multiline]=false 
    RegExp[lastMatch]=
    RegExp[lastParen]=
    RegExp[leftContext]=hello
    RegExp[rightContext]=world
    RegExp[$1]=
    RegExp[$2]=
    RegExp[$3]=
    RegExp[$4]=
    RegExp[$5]=
    RegExp[$6]=
    RegExp[$7]=
    RegExp[$8]=
    RegExp[$9]=

 

  • 2.3.正則表達式的使用

    先來看一段代碼比較:


    var
    text = 'hello2world'; var reg = /\d/g; var result = reg.exec(text); console.log(RegExp.lastMatch);
    reg=new RegExp("\\w","g");
    result = reg.exec(text);
    console.log(RegExp.lastMatch);//輸出結果 2 h

    由以上的輸出結果,咱們知道,全部的正則表達式實例在使用的時候都會改變RegExp構造函數的屬性, 因此在每一次正則表達式使用的時候咱們均可以經過RegExp構造函數的屬性,來取得咱們想要的結果。


3.正則表達式exec(),test()以及match()方法及其區別。

  • 3.1.非全局模式---global=false;

    • exec()函數: 


      exec() 方法用於檢索字符串中的正則表達式的匹配,返回值是數組
      語法:
      RegExpObject.exec(string)
       參數  描述  返回值
       string  被檢索的字符串  字符串數組


       


      在非全局模式下,每次檢索字符串的時候都是從最開始的位置檢索,返回的數組,第一項是徹底匹配的項,第二項是捕獲項!等於RegExp.$1,同時也改變RegExp構造函數的屬性。

      var text = 'hello2world2sad';
      var reg = /\w*(\d)\w/;
      var result = reg.exec(text);
      
      console.log(result[0]);//hello2world2s   貪婪匹配
      console.log(result[1]);//2
      
      result = reg.exec(text);
      
      
      
      console.log(result[0]);  //
      
      hello2world2s
      console.log(result[1]);//2
      
      console.log(RegExp.$1) //2

       

    • test()函數: 

      test() 方法用於檢查字符串中是否與正則表達式匹配,返回值是布爾值。

      語法:

      RegExpObject.test(string)
       參數  描述 返回值
       string  被檢索的字符串 布爾值



      在非全局模式下,每次檢索字符串的時候都是從最開始的位置檢索,返回 true|false,同時也改變RegExp構造函數的屬性。  
      var text = 'hello2world';
      var reg = /\w*(\d)\w/;
      var result = reg.test(text);
      console.log(result);  //true
      result = reg.test(text);
      console.log(result);  //true
      console.log(RegExp.$1) //2

       

    • match()函數


      match() 方法用於檢查字符串中是否與正則表達式匹配,返回值是數組。
      stringObject.match(searchvalue)
      stringObject.match(regexp)

      語法:

       參數  描述  返回值
       seachValue  字符串  數組
       參數  描述 返回值
      regexp  正則表達式 數組


      在非全局模式下,每次檢索字符串的時候都是從最開始的位置檢索,返回的是一次檢索結果後的數組,同時也改變RegExp構造函數的屬性。  

       

      var text = 'hello2world2sad';
      var reg = /\w*(\d)\w/;
      var result = text.match(reg);  
      console.log(result[0]);  //hello2world2s
      console.log(result[1]);   //2
      result = text.match(reg);
      console.log(result[0]);  // hello2world2s
      console.log(result[1]);  //2


      3.1總結:

      在非全局模式下:

        test()方法:   返回的老是布爾值,每次均從字符串首位開始檢索字符串。

        exec()方法:  返回值是數組,數組中保存的老是第一次的匹配結果,每次檢索均是從字符串首位開始檢索。

        match()方法:返回值是數組,數組中保存的一次的匹配結果,每次檢索均是從字符串首位開始檢索,返回結果和exec()的結果老是一致的。

             在非全局模式下,exec()和match()惟一的區別就是調用者和函數參數位置互換而已。

  •  3.2.全局模式下---global=true 

    • exec()函數:

      在全局模式下,每次檢索字符串的時候都是從字符串上一次檢索的結束位置開始檢索,每次返回的數組,第一項是徹底匹配的項,第二項是捕獲項!等於RegExp.$1,同時也改變RegExp構造函數的屬性。

      代碼以下:

      var text = 'hello1hello2hello3hello4hello5hello';
      var reg = /[a-z]*(\d)/g; var result = reg.exec(text); console.log(result); //["hello1", "1"]
      result = reg.exec(text); console.log(result); //["hello2", "2"]

       因此,能夠利用這種特性用正則表達式,遍歷檢索字符串。

    • test()函數:


        在非全局模式下,每次檢索字符串的時候都是從上一次檢索後的位置開始檢索,返回 true|false,每次檢索都會改變RegExp構造函數的屬性。

      var text = 'hello1hello2hello3hello4hello5hello';
      var reg = /[a-z]*(\d)/g; var result = reg.test(text); while (result) { console.log(RegExp.$1); //1 2 3 4 5 result = reg.test(text); }
    • match()函數 


       match函數在全局模式下,和非全局模式下有很大的區別。其在全局模式下,一次檢索後,返回的雖然是個數組。可是數組中保存的全部匹配正則表達式的項。 以下所示:
      var text = 'hello1hello2hello3hello4hello5hello';
      var reg = /[a-z]*(\d)/g; var result = text.match(reg); console.log(result); //["hello1", "hello2", "hello3", "hello4", "hello5"]


    3.2總結:

    在全局模式下:

      test()方法:   返回的老是布爾值,每次均是從上一次檢索後的位置開始檢索字符串。

      exec()方法:  返回值是數組,數組中保存的是每一次的匹配結果,每次均是從上一次檢索後的位置開始檢索字符串。

      match()方法:返回值是數組,數組中保存的是全部的匹配結果,一次檢索後,字符串會被檢測完。下次在檢索的時候,老是從字符串開頭開始檢索,兩次返回的結果老是相同的。

    在全局模式下,exec()和test()每次檢索都是從上一次檢索後的位置開始向後檢索。而match()老是將全部匹配的結果保存在數組中。

4.字符串經常使用的正則表達式函數 

  • 4.1. split()函數

       split()函數的參數能夠是字符串也能夠是正則表達式。返回的結果老是數組

    var text = 'hello1hello2hello3hello4hello5hello';
    var reg = /\d/g;
    var result = text.split(reg);
    
    console.log(result); //hello ,hello ,hello, hello, hello

     

  • 4.2. repalce()函數

      replace()函數的參數能夠是字符串也能夠是正則表達式,當其爲正則表達式的時候,使用以下   

    var reg = /(^\s*|\s*$)/g //去掉字符串的開頭和結尾空格
    var hello = '    dasdasd     ';
    console.log(hello.replace(reg, '').length);
    var reg = /(\w)/g //將字符串中小寫換成大寫
    var hello = 'dasdasd';
    console.log(hello.replace(reg, function () { return RegExp.$1.toUpperCase() })); //DASDASD
相關文章
相關標籤/搜索