天天看點

javascript正規表達式詳解(中級篇)

javascript正規表達式詳解

在基礎篇中我們已經講解了如何來使用正規表達式等一些基礎知識,這裡我們要講解的是正規表達式中的模式比對,它們能幫助我們更好更快的寫出漂亮的正規表達式,當然它們也是基礎的知識,更高端正規表達式的需要自己在深入的研究!下面對模式的分類是我自己為其命的名,目的隻是能更快更準的記住這些模式。

快捷比對元字元:

.  點元素:表示比對一個且必須一個任意字元;(換行符\n除外)

\s 表示比對一個空格字元

\S 非\s

\d 表示比對0-9中的任意一個數字

\D 非\d

\w 表示比對一個數字或者字元或則下劃線

\W 非\w

\b 邊界比對

\B 非\b

這些是最基礎最常用的一些快捷的比對方式

重複(區間)比對元字元:

x* 表示比對0個或者一個或者多個x

x+ 表示比對1個或者多個x

x? 表示比對0個或者1個x

x{m,n} 表示比對至少m個最多n個x,其中包括了m和n

x{m} 表示精确的比對m個x

x{m,} 表示比對m個或者多于m個x

我想大家看到這裡已經覺得自己能寫出漂亮的正規表達式了,我們來試一試

var regExp = /\d*/;表示比對0個或者一個或者多個數字

var regExp = /.+/;表示比對任意字元一次或者多次;是的你已經能寫出一些漂亮的正規表達式了,我們還要更上一層樓,繼續往下學習;

集合比對:

[a-z] 表示比對小寫字元a到z,其中包括了a和z

[a-z0-9] 表示比對a-z和0-9;這種形式的為集合的複合式的寫法

[^a-z] 表示非a-z中的任意一個字元

分組比對:

(google) 将Google看為一組也就是一個整體;

分組中有一個很有意思的功能,它比對到的第一組結果儲存在RegExp.$1中依次類推RegExp.$2....;

例子:

var regExp = /8(google)+8/;

var str = "8googlegoogle8";

var arr = regExp.exec(str);

alert(RegExp.$1); 此處将會彈出google;

邏輯比對:

| 表示或比對;如:var regExp = /a|b/;表示比對a或者b;

限定比對:

^ 行首比對,該符号必須寫在第一個/的後面;

$ 行尾比對,該字元必須寫在最後一個/的前面;

例子:

var regExp = /\d?google/; 表示在google的前面必須要有0個或者1個數字

var str = "6666google";

var bool = regExp.test(str); 大家很可能會認為這個會傳回false,因為Google的前面已經超過了一個數字,但是它會傳回true,因為它可以從最後一個6開始比對,如果var regExp = /^\dgoogle/;這樣寫,那麼上面的例子則會傳回false,因為它限定了從行首開始比對;行尾比對和上面的例子類似,就不在費筆墨了。

有了上面的快捷比對,重複比對,集合比對,分組比對,邏輯比對,限定比對我想絕大部分的運用正規表達式的知識你都能搞定了,然後加上項目的真正的練習我相信我們能更好!

項目經驗:

在用exec時我相信大家都很容易犯一個書寫的錯誤,因為我在項目中有過經驗教訓,這裡分享給大家;

function regExec(str){

   var regExp = /8google*8/ig;

   var arr = regExp.exec(str);

   if(arr.length > 0){....} //如果比對到的結果集數組長度大于0然後執行代碼

};

這種寫法的緻命之處在于當沒有比對到時,arr為null,null沒有length屬性,是以在if中運用null.length将報錯;

正确的寫法是:

if(arr){.....};如果不是null,任何對象将轉換為true,而是null時則會轉換為false;

繼續閱讀