1. 程式人生 > >js小知識 正則表達式的定義

js小知識 正則表達式的定義

string類 分組 search方法 單詞數 下回 clas 三個參數 變化 console

js定義正則表達式有兩種方式:普通方式,構造函數方式

正則對象是js的內置對象

正則的屬性

正則的方法

js中字符串的方法

一、普通方式(雙斜杠//方式):var reg = /表達式/附加參數

  表達式放在雙斜杠"//"中,表達式是一個字符串,可以使用特殊字符

  附加參數放在第二個斜杠"/"的後秒,是用來擴展表達式的含義,主要有三個參數:g,i,m;g代表可以全局配置;i代表不區分大小寫配置;m代表可以多行配置;這三個參數可以任意組合或者不加任何參數;

  例如:

    var reg=/a*b/;
   var reg=/abc+f/g; abc+f為表達式 g為附加參數

二、構造函數:var reg=new RegExp(“表達式”,”附加參數”);

  例如:

   var reg=new RegExp(“a*b”);
  var reg=new RegExp(“abc+f”,"g”);

三、普通方式與構造函數方式的區別

  普通方式中的表達式必須是一個常量字符串,而構造函數中的表達式可以是常量字符串,也可以是一個js變量

  例如:

    var reg = new RegExp("^(?:([1-" + flag + "])(?!.*\\1.*$))+$", "gim");//falg是一個變量

四、正則對象及其屬性

  正則對象是JS中內置的一個對象,好比Array以及Math一樣,不需要第三方庫的支持;

  技術分享

  可以看到它擁有global屬性,該屬性為布爾類型,用來表示該正則是否是全局匹配,ignoreCase屬性,布爾類型,用來指示是否忽略大小寫,lastIndex為number類型,用來表示上次匹配成功的位置,multiline,布爾類型,用來表示是否是多行匹配,source,string類型,用來表示正則的內容。

五、正則表達式的方法

通常對於一個正則對象來講,我們能夠使用的方法基本上有三個,即regObj.test,regObj.exec及regObj.compile

1)test方法,該方法用來測試某個字符串是否與正則匹配,匹配就返回true,否則返回false。

該方法接受一個字符串作為參數

代碼:

 var reg=/boy(s)?\s+and\s+girl(s)?/gi;
 console.log(reg.test(‘boy    and   girl‘));

結果在控制臺上打印出了true。該方法也是最常用的一個方法。

2)compile方法

該方法的作用是能夠對正則表達式進行編譯,被編譯過的正則在使用的時候效率會更高,適合於對一個正則多次調用的情況下,如果對一個正則只使用一兩次,那麽該方法沒有特別顯著的效應。

接受的參數也是一個正則。

代碼:

技術分享
    var reg=/[abc]/gi;
    console.log(reg.test(‘a‘));
    reg=/[cde]/gi;
    console.log(reg.test(‘a‘));
    reg.compile(reg);
    console.log(reg.test(‘a‘));
技術分享

結果:

技術分享

被編譯的正則和沒有編譯的正則在測試結果上沒有任何區別,只是多次調用的效率上會更高一些。

3)exec方法

該方法屬於一個比較復雜的方法,它接受一個字符串,返回的是一個數組,數組中第0個元素是匹配的子字符串,第二個元素是正則中的第一個子分組匹配的結果(如果有子分組,即正則中存在用圓括號括起來的分組),第三個是正則中第二個子分組匹配的結果(如果有第二個子分組)...以此類推,如果沒有正則子分組,那麽該數組長度僅僅為1,就是匹配到的那個子字符串。同時,返回的這個數組同時還是一個對象,它擁有兩個屬性,分別為index表示當前匹配到的子字符串所處的位置,input屬性表示被匹配的原始字符串。最後,該方法中的正則對象如果不是全局匹配,即沒有g修飾符,則每次調用只會從字符串開頭處匹配第一個結果,且每次調用結果都是一樣的。只有指定為全局匹配,才能夠按照從左往右依次去匹配,每次調用匹配一個結果,正則對象的lastIndex屬性前進到本次匹配的末尾位置,下回再調用的時候,會從lastIndex處開始匹配而不是從頭匹配。

全局匹配代碼:

技術分享
   var reg=/(\w)l(\w)/g;
   var str="hello world hello 123 hello programmer hello test";
   var arr=reg.exec(str);
    while(arr){
        console.dir(arr);
        console.log("lastIndex:"+reg.lastIndex);
        arr=reg.exec(str);
    }
技術分享

結果如下:

技術分享

非全局匹配代碼:

技術分享
   var reg=/(\w)l(\w)/;
   var str="hello world hello 123 hello programmer hello test";
   var arr=reg.exec(str);
   var i=0;
    while(arr){
        i++;
        if(i<=4){
        console.dir(arr);
        console.log("lastIndex:"+reg.lastIndex);
        arr=reg.exec(str);
        }
        else{
            break;
        }
    }
技術分享

這裏為了防止無限輸出,只輸出前5個結果,如下:

技術分享

這個時候每次調用的結果都一樣,lastIndex根本沒有發生變化。

六、js中字符串的方法

1)search方法

該方法是string對象的一個方法,用來查找第一次匹配的子字符串的位置,如果找到就返回一個number類型的index值,否則返回-1,它返回的只是第一次匹配的位置。

它接受一個正則或者子字符串為參數,這裏我們只討論正則的情況。

代碼:

    var str="hello world";
    console.log(str.search(/o/g));

輸出結果為4,可以看到盡管具有多個匹配結果而且也聲明為全局匹配,但是還是返回的是第一個匹配到的子串的位置;

2)replace方法

該方法用來將字符串中的某些子串替換為需要的內容,接受兩個參數,第一個參數可以為正則或者子字符串,表示匹配需要被替換的內容,第二個參數為被替換的新的子字符串。如果聲明為全局匹配則會替換所有結果,否則只替換第一個匹配到的結果。

代碼如下:

    var str="hello world,hello test";
    console.log(str.replace(/hello/g,‘hi‘));

結果為hi world,hi test

如果將上面代碼中的g修飾符去掉,則返回的結果是hi world,hello test

3)split方法

該方法主要用來將一個字符串拆分成一個數組,它接受一個正則或者子字符(串)作為參數,返回一個數組,簡單情況下,我們不需要使用正則,只有在字符串拆分規則不統一的情況下才需要使用正則,如下:

    var str="how|old*are    you";
    var arr=str.split(/\||\*|\s+/);
    console.log(arr);

這裏需要將str拆分為單詞數組,由於每個單詞之間存在不一樣的分隔符,我們采取正則來匹配,結果如下:

技術分享

4)match方法

該方法接受一個正則作為參數,用來匹配一個字符串,它的輸出結果在不是全局匹配的情況下和exec方法的結果一致即一個數組並帶有額外的屬性,如果采用全局匹配,則不返回任何和其被匹配字符串相關的信息,只返回匹配的結果。

非全局匹配代碼:

技術分享
    var reg2=/(\w)s(\w)/;
    var str2="ws1esr";
    var result=str2.match(reg2);
    var i=0;
  while(result){
      i++;
      if(i<=4){
      console.dir(result);
      console.log("lastIndex:"+reg2.lastIndex);
      }
      else{
        break;
      }
  }
技術分享

結果如下:

技術分享

非全局匹配下,結果和exec非全局匹配方法返回的完全一致,

全局匹配代碼:

    var reg3=/(\w)s(\w)/g;
    var str4="ws1estqsa";
    console.dir(str4.match(reg3));

結果如下:

技術分享

可以看到,在全局匹配下的時候,它不同於exec方法,它會一次性將所有匹配結果以數組形式返回,且這個數組沒有其他屬性用來指向被匹配字符串的信息,而exec方法在全局匹配下每次返回的依然是本次匹配的結果數組,且這個數組中只包含本次匹配信息,同時又擁有指向被匹配字符串的信息,即match方法在全局匹配下一次性返回了所有匹配結果,而exec在全局匹配下返回的依然是當次匹配結果。

七、正則驗證大全鏈接http://www.cnblogs.com/zxin/archive/2013/01/26/2877765.html

js小知識 正則表達式的定義