js正則表達式

原文:http://www.cnblogs.com/xiaofu/articles/1613463.html

1.正則表達式

正則的exec方法和字符串的match方法,當沒有全局標誌g時,它們兩的行爲是一樣的,有index,input,lastindex等屬性!除了返回與表達式相匹配的文本外,所有匹配的子串也會返回!!
             1.1使用RegExp對象

                     例:

                     var match=”cat”;
                     var reCat=/cat/;
                     或 reCat=new RegExp(“cat”);
                     alert(reCat.test(match));//
                     RegExp的test方法測試字符串是否匹配這個模式。
                     var match=”a bat,a Cat,a fAt bat,a faT cat”;

                     var reAt=/at/;
                     var arrMatches=reAt.exec(match);

                     RegExp對象的exce方法返回一個數組,數組中的第一條目是第一個匹配;其他的是反向引用。
                     String對象數組有的match()方法,它會返回一個包含所有字符串中的所有匹配的數組。

                     var s=”a bat,a Cat,a fAt bat,a faT cat”;
                     var reAt=/at/gi;
                     或 reCat=new RegExp(“cat”,”gi”);
                     var arr=s.match(reAt);

                     String對象的Search()字符串方法返回在字符串中出現的一個匹配的位置。

                  Alert(s.search(reAt));

             1.2擴展的字符串方法

                     String對象的replace()和split()方法都可以傳遞正則表達式。
                     這裏的replace()方法的第二個參數可以傳遞一個函數。這處函數可以接受一個參數,即匹配了的文本,並返回應當進行替換的文本

                     var tt=”The sky os red”;
                     var re=/red/;

                     var sText=tt.replace(re,function(sMatch){ return “blue”;});


                     sMatch這個參數就是用模式re匹配後的文本!!

       2.簡單模式
              2.1元字符
                     正則表達式的元字符是正則表達式語法的一部分。

                     ( [ { \ ^ $ | } ? * + .

                     任何時候要在正則表達式中使用元字符都必須對它們進行轉義用’\’。      

                     Var retest=/\?/;

                     或var retest=new RegExp(“\\?”);//必須用兩個反斜槓,如果用的一個反斜槓,那麼JS解釋器會按照\n的方式翻譯\?.

              2.2使用特殊字符

                     轉義字符

              2.3字符類

                     就是把一些字符放入方括號中,然後正則表達式去匹配裏面的各個字符。也即只能匹配方括號中的任意一個字符,不是同時匹配全部啊!!!

                    2.3.1.簡單類
                            例:[adf]等
                     2.3.2.負向類
                            例:[^adf]等,告訴正則表達式不能匹配脫字符^後面跟着的字符。
                     2.3.3.範圍類
                            例:[a-z] [A-Z] [0-9] [^b-z]等
                     2.3.4.組合類
                            例 [a-m1-4\n]注意各個內部類之間沒有空格。
                     2.3.5.預定義類

                            代碼             等同於                         匹配

                            .             [^\n\r]                          除了換行和回車之外的任意字符      

                            \d           [0-9]                                   數字

                            \D           [^0-9]                          非數字

                            \s            [\t\n\f\r\x0b]                 空白符

                            \S           [^\t\n\f\r\x0b]               非空白符

                            \w           [a-xA-Z_0-9]                單詞字符 (有可能匹配漢字)看語言支持Unicode字段否

                            \W          [^a-xA-Z_0-9]                     非單詞字符

              2.4量詞

                     2.4.1.簡單量詞

                     代碼                                          描述

                     ?                                                出現零次或一次

                     *                                               出現零次或多次(任意次)

                     +                                               出現一次或多次

                     {n}                                            剛好出現n次

                     {n,m}                                        至少出現n次,至多m次

                     {n,}                                           至少出現n次

              2.4.2.貪婪的、惰性的和支配性量詞

                     貪婪性量詞先看整個字符串是否匹配,如果沒有匹配,它先去掉該字符串最後一個字符,並再次嘗試。這個過程一直重複下去。

                     惰性量詞先看字符中的第一個字符是否匹配,如果不匹配,就讀入下一個量詞,組成兩個字符的字符串,再比匹配。這個過程一直重複下去,直到匹配或沒有匹配。

                     支匹配性量詞只嘗試匹配整個字符串,如果整個字符串不能產生匹配,不做進一步嘗試。

貪婪                            惰性                                   支配

?                                  ??                                       ?+

*                                 *?                                       *+

+                                 +?                                       ++

{n}                              {n}?                                          {n}+

{n,m}                          {n,m}?                                {n,m}+

{n,}                             {n,}?                                  {n,}+

例:

              Var sToMatch=”abbbaabbbaaabbb1234”;
              Var re1=/.*bbb/g;
              Var re2=/.*?bbb/g;

              Var re3=/.*+bbb/g;

              如果想獲得的匹配是”abbb”,”aabbb”,”aaabbb”,這三個表達式中只有re2能匹配成功。

              2.4.3標誌

                     字符                                   含義

                     i                                  執行不區分大小定的匹配

                     g                                 執行一個全局匹配,即找到所有匹配,而不是在找到第                                                        一個之後就停止

                     m                                多行模式,^匹配一行的開頭和字符串的開頭,$匹配一行的結尾或字符串的結尾

       2.5複雜模式

              2.5.1分組

                     分組是通過用括號包圍一系列字符、字符類及量詞來使用的。每次必須全部匹配括號中的所有字符。

                     例:

                            var reg1=/(dog)?/;//匹配0個或一個dog字符串序列

                            var reg2=/(dog)*/;//匹配0 個或多個dog字符串序列

                            var reg3=/(dog){2}/;//字符序列”dog”將在一行上連續出現兩次!

              2.5.2反向引用

                     在表達式計算完後對分組的利用,即每個分組都被存儲在一個特殊的地方以備使用。這些存儲在分組中的特殊值,我們稱之爲反向引用。

                     反向引用是按照從左到右遇到的左括號字符的順序進行創建和編號的。例如表達式(A?(b?(c?)))將產生編號1-3的三個反向引用。

                     (1)(A?(B?(c?)))

                     (2)(B?(c?))

                     (3)(c?)

                     首先,使用正則表達式對象的test() 、exec()方法或string對象的match() 、search()方法後,反向引用的值可以從RegExp構造函數中得到

              例:

                     var test=”#12345”;
                     var re=/#(\d+)/;
                     re.test(test);
                     alert(RegExp.$1);

                     使用這test方法後,所有的反向引用都被保存在RegExp構造函數,從RegExp.$1開始,如果還有第二個引用,就是RegExp.$2.

                     然後,還可以直接在定義分組的表達式中包含反向引用,這可以通過使用特殊轉義序列\1 \2等實現。

                     var tt=”dogdog”;                 
                     var re=/(dog)\1/;
                     alert(re.test(tt));//outputs ‘true”

                     正則表達式re首先創建單詞dog的組,然後又被特殊轉義序列\1引用,使得這個表達式等同於/dogdog/。

                     最後,反向引用可以用在String對象的replace()方法中,這通過使用特殊字符序列$1、$2等實現。

                     var str=”1234 5678”;
                     var re=/(\d{4})(\d{4})/;
                     var new=str.replace(re,”$2 $1”);
                     alert(new);//outputs “5678 1234”;

              2.5.3.候選

                     例

                            var  strRed=”red”;
                            var  strBlue=”blue”;
                            var   re1=/(red | blue)/;

                            把一個管道符”|” 放在兩個單獨的模式之間,如上所示。當對這個模式進行測試時,只要有一個被匹配就返回true,因爲它相當於一個or模式,即任何一個匹配就可以。

              2.5.4非捕獲性分組

                     前面的產生反向引用的分組,我們稱之爲捕獲性分組。如果分組不想產生反向引用,那麼只要在括號的後面加一個問號和一個緊跟的冒號.

                     var t=”#3142134”;
                     var re=/#(?:\d+)/;
                     re.test(t);
                     alert(RegExp.$1);//outputs “”;

              2.5.5前瞻

                     它告訴正則表達式運算器向前看一些字符而不移動其位置。

                     正向前瞻檢查的是接下來出現的是不是某個特定字符集。而負向前瞻則是檢查接下來的不應該出現的特定字符集。

                     創建正向前瞻要將模式放在(?=和)之間,注意,這不是分組,雖然它也用到了括號。事實上,分組是不會考慮前瞻的存在的。

                     var str1=”bedroom”;
                     var str2=”bedding”;
                     var re=/(bed(?=room))/;
                     alert(re.test(str1));//outputs “true”
                     alert(RegExp.$1));//outputs “bed”;
                     alert(re.test(str2))//ouputs “false”;

                     創建負向前瞻要將模式放在(?和)之間,

                     var str1=”bedroom”;
                     var str2=”bedding”;
                     var re=/(bed(?!room))/;
                     alert(re.test(str1));//outputs “false”
                     alert(RegExp.$1));//outputs “bed”;
                     alert(re.test(str2))//ouputs “true”;

              2.5.6邊界

                     指定了模式的位置。$,^可以改變匹配的方向,或者說是改變貪婪和惰性量詞的默認行爲。看下面例子

                     邊界                     描述

                     ^                          行開頭

                     $                          行結尾

                     \b                         單詞的邊界,就是位於\w和\W之間的位置,或位於字符\w                                           和字符串的開頭或結尾之間的位置。

                     \B                         非單詞邊界

                     例:

                            var str=”Important word is ths last one”;
                            var re=/(w+)\.$/;
                            re.test(str);

                     這個例子查找的一行結束之前出的跟着一個句號的一個或多個單詞字符。這個例子它改變了那個貪婪性量詞的方向,它先匹配整個串,然後去掉頭的一個字符,繼續匹配下去。

                     var str=”Important word is ths last one”;
                     var re=/\(.+?)\b/;
                     re.test(str);
                     alert(RegExp.$1);//outputs “important”

                     這裏用惰性量詞來制定在單詞邊界之前可以出現任何字符,且可出現一個或多次。

                     注意行的開始和行的結束,通常由^和$表示的位置,對應也也認爲是單詞的邊界。

              2.5.7多行模式

                     要指定多行模式,只要在正則表達式後面添加一個m選項。這會讓$邊界匹配換行符(\n)以及字符串真正的結尾。

                     多行模式同樣會改變^邊界的行爲,這時它會匹配換行符之後的位置。

                     var str=”first second\nthird fourth\nfifth sixth”;
                   var re=/(\w+)$/gm;
                 var new=str.match(re);//outputs “second”,”fourth”,”sixth”

       2.6理解RegExp對象

              2.6.1實例屬性

                     有用的lastIndex屬性,它可告訴你正則表達式在某個字符串中停止之前,查找了多遠(即下次匹配將會從哪個字符位置開始)。這個屬性只對exec和test方法纔會填入(廢話,RegExp對象只有這兩個方法)。必須要有全局標誌(g)才行。

                     var str=”bbq is short”;
                     var re=/b/g;
                     re.exec(str);
                     alert(re.lastIndex);//outputs “1”;下次從第二個b開始,位置1
                     re.exec(str);
                     alert(re.lastIndex);//outputs “2”

              2.6.2RegExp對象的兩個方法

                     test()方法

                            檢測一個字符串是否含有一個模式。

                      exec()方法

                            (1) 在調用非全局(沒加g標誌)的RegExp對象的exec()方法來檢索字符串string,從中得到與表達式regexp相匹配的文本。如果exec()找到了匹配的文本,它就會返回一個結果數組。否則,返回一個null。這個返回的第0個元素就是與表達式相匹配的文本。第1個元素是與regexp的第一個子表達式(分組表達式)相匹配的文本。第2個元素以此類推。還有一個length屬性,除了length屬性和數組元素外,exec()方法還返回兩個屬性,index屬性聲明的是匹配文本的第一個字符的位置,input屬性指定的就是string。在調用非全局(沒加g標誌)的RegExp對象的exec()方法時,返回的數組與調用方法String.match()方法相同。

                            在調用全局的RegExp對象的exec()方法時,exec()的行爲不同。它每次匹配是從regexp的屬性lastIndex指定的字符處開始檢索字符串string(相當於它是有記憶的,執行一次後,下次該從哪執行是記錄下來的,而沒有加全局標誌的每次都string頭開始匹配查找)。當它找到了與表達式相匹配的文本時,在匹配後,它將把regexp的lastIndex屬性設置爲匹配完文本後的下一個字符的位置。這樣可以反覆調用exec()方法來匹配所有匹配文本。當再也找不到匹配文本時,返回null,自動把屬性設置爲0。當然它的第1個元素及以後的元素仍然存放的是子表達示的文本。這在match()方法中是沒有的。

                            簡單的來說,exec()方法的全局檢索和非全局檢索區別在於:全局檢索會多出一個lastIndex索引來指示下一次開始匹配字符的位置。而且可以多次調用exec()方法來匹配所有匹配文本。

                            (2) 如果 regexp 沒有標誌 g,那麼 match() 方法就只能在 stringObject 中執行一次匹配。如果沒有找到任何匹配的文本, match() 將返回 null。否則,它將返回一個數組,其中存放了與它找到的匹配文本有關的信息。該數組的第 0 個元素存放的是匹配文本,而其餘的元素存放的是與正則表達式的子表達式匹配的文本。除了這些常規的數組元素之外,返回的數組還含有兩個對象屬性。 index 屬性聲明的是匹配文本的起始字符在 stringObject 中的位置,input 屬性聲明的是對 stringObject 的引用。

                            如果 regexp 具有標誌 g,則 match() 方法將執行全局檢索,找到 stringObject 中的所有匹配子字符串。若沒有找到任何匹配的子串,則返回 null。如果找到了一個或多個匹配子串,則返回一個數組。不過全局匹配返回的數組的內容與前者大不相同,它的數組元素中存放的是 stringObject 中所有的匹配子串(也就是說返回的數組中不是存放的正則表達式的子達式的匹配文本而是與個表達式匹配的文本,可能有多個),而且也沒有 index 屬性或 input 屬性。

注意,無論regexp是否全局模式,exec()會將完事的細節添加到返回的數組中。這是exec()方法與match()方法不同的地方。

                            例如:

                            var pattern=/\bJava\w*\b/g;
                            var text="JavaScript is more fun than Java or JavaBeans";
                            while((result=pattern.exec(text))!=null)
                                   {
                                   alert("Matched '"+result[0]+"' at position "+result.index+" next seatch begins at position "+ pattern.lastIndex);
                                   }//必須循環才能找出所有匹配文本。
                            //
                            “1 plus 2 equals 3”.match(/\d+/g) // returns [“1”,”2”,”3”]返回的子串
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章