JavaScript正則表達式

正則表達式是對字符串(包括普通字符(例如,a 到 z 之間的字母)和特殊字符(稱爲「元字符」))操做的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個「規則字符串」,這個「規則字符串」用來表達對字符串的一種過濾邏輯。正則表達式是一種文本模式,模式描述在搜索文本時要匹配的一個或多個字符串。正則表達式

JavaScript經過RegExp來支持正則表達式。正則表達式建立方式 var reg=/pattern/flags。其中pattern能夠是任何簡單或者複雜的正則表達式,能夠包含字符串、分組、限定符、向前查找以及方向引用。每一個正則表達式能夠帶有一個或者多個標記,用以表達正則表達式的行爲。正則表達式匹配模式包含3個標記:數組

g:表示全局模式,模式應用於全部字符串,而非發現第一個匹配項當即中止。函數

i:表示不區分大小寫,在肯定匹配項時忽略模式與字符串的大小寫。spa

m:多行模式,在到達一行末尾時,還會繼續查找下一行中是否存在於模式匹配的項。code

所以,一個正在表達式就是一個模式與3個標記的組合體,不一樣的組合產生不一樣的效果。模式中使用的元字符必須轉義,元字符包括( [ {  \ ^ $ | ) ? * + . ] }。對象

                                //匹配字符串中全部at的實例
                var pattern1 =/at/g;
                //匹配字符串中一個‘bat’或者‘cat’,不區分大小寫
                var pattern2=/[bc]at/;
                //匹配字符串中全部以at結尾的三個字符串,不區分大小寫
                var pattern3=/.at/gi;
                //匹配字符串中一個[bc]at,不區分大小寫
                var pattern4=/\[bc\]at/;
                //匹配字符串中全部以.at,不區分大小寫
                var pattern5=/\.at/gi;    

上述代碼中 pattern1匹配字符串中全部at的實例,pattern2匹配字符串中第一個bat或者cat,不區分大小寫。pattern3匹配字符串中以at結尾的三個字符串,不區分大小寫。pattern4匹配字符串中第一個[bc]at的字符,不區分大小。這裏對[]進行了轉義。pattern5一樣進行了轉義,因此匹配字符串中全部.at字符。blog

var pattern6 = new RegExp("\\.at","gi");

經過RegExp函數定義的正則表達式與字面量定義的有點不一樣。上面的pattern6與pattern5是同樣的效果,可是RegExp的兩個參數都是字符串,因此須要對第一個參數的字符進行雙重轉義。ip

               for(var i=0;i<10;i++){
                    var pattern=/at/g;
                    var index=pattern.test("cathello");
                }

RegExp的每一個實例都有如下屬性:字符串

global:布爾值,表示是否設置了g標誌;input

ignoreCase:布爾值,表示是否設置了i標誌;

lastIndex:表示開始搜索下一個匹配項的字符位置,從0開始;

mutilline:表示是否設置了m標記

source:正則表達式的字符串表示;

RegExp的實例方法exec,能夠捕獲組。exec方法接受一個參數,就是要進行應用模式的字符串。返回包含第一個匹配項信息的數組,在沒有匹配項的狀況下返回null。返回的數字是Array實例,可是包含index和input兩個屬性。index表示匹配項的位置,input表示應用正則表達式的字符串。

若是 exec() 找到了匹配的文本,則返回一個結果數組。不然,返回 null。此數組的第 0 個元素是與正則表達式相匹配的文本,第 1 個元素是與 RegExpObject 的第 1 個子表達式相匹配的文本(若是有的話),第 2 個元素是與 RegExpObject 的第 2 個子表達式相匹配的文本(若是有的話),以此類推。除了數組元素和 length 屬性以外,exec() 方法還返回兩個屬性。index 屬性聲明的是匹配文本的第一個字符的位置。input 屬性則存放的是被檢索的字符串 string。咱們能夠看得出,在調用非全局的 RegExp 對象的 exec() 方法時,返回的數組與調用方法 String.match() 返回的數組是相同的。

可是,當 RegExpObject 是一個全局正則表達式時,exec() 的行爲就稍微複雜一些。它會在 RegExpObject 的 lastIndex 屬性指定的字符處開始檢索字符串 string。當 exec() 找到了與表達式相匹配的文本時,在匹配後,它將把 RegExpObject 的 lastIndex 屬性設置爲匹配文本的最後一個字符的下一個位置。這就是說,您能夠經過反覆調用 exec() 方法來遍歷字符串中的全部匹配文本。當 exec() 再也找不到匹配的文本時,它將返回 null,並把 lastIndex 屬性重置爲 0。

若是在一個字符串中完成了一次模式匹配以後要開始檢索新的字符串,就必須手動地把 lastIndex 屬性重置爲 0。

function RegExpTest() {
                    var src = "The rain in Spain falls mainly in the plain.";
                    var re = /(\w+)/g; // 建立正則表達式模式。    
                    var arr;
                    while((arr = re.exec(src)) != null) {
                        //document.write(arr.index + "-" + RegExp.lastIndex + "\t" + arr[0]); //此處RegExp.lastIndex和arr.lastIndex均有一樣的屬性,能夠互換。在此注意IE6和7的lastIndex重設置0的bug
                        console.log(arr.index+"-"+re.lastIndex+"-"+arr[0]);
                    }
                };

                RegExpTest();

 

若是上面的正則表達式不是全局表達式,則上述循環爲死循環,由於re的lastindex在執行以後,屬性被重置爲0,因此循環一直在0,3處循環。

 正則表達式的第二個方法是test(),它接受一個字符串參數,在模式與該參數匹配的狀況下,返回true;不然返回false。在只想知道目標字符串與模式是否匹配時,可使用test方法。test方法常常被用在if中。

var pattern1 =/at/g;
                if(pattern1.test("cat")){
                    console.log("the pattern is matched");
                }

上面的代碼test方法返回true。

JavaScript的模式匹配有必定侷限性,如向後查找,並集和交集等。

相關文章
相關標籤/搜索