標籤:介紹 轉義 reg glob 運算式 last pat javascrip source
ECMAScript 通過 RegExp 類型來支援Regex。使用下面類似 Perl 的文法,就可以建立一個正
則運算式
var expression = / pattern / flags ;
其中的模式(pattern)部分可以是任何簡單或複雜的Regex,可以包含字元類、限定符、分組、
向前尋找以及反向引用。每個Regex都可帶有一或多個標誌(flags),用以標明Regex的行為。
Regex的匹配模式支援下列 3 個標誌。
? g:表示全域(global)模式,即模式將被應用於所有字串,而非在發現第一個匹配項時立即
停止;
? i:表示不區分大小寫(case-insensitive)模式,即在確定匹配項時忽略模式與字串的大小寫;
? m:表示多行(multiline)模式,即在到達一行文本末尾時還會繼續尋找下一行中是否存在與模
式匹配的項。
例子
/** 匹配字串中所有"at"的執行個體*/var pattern1 = /at/g;/** 匹配第一個"bat"或"cat",不區分大小寫*/var pattern2 = /[bc]at/i;/** 匹配所有以"at"結尾的 3 個字元的組合,不區分大小寫*/var pattern3 = /.at/gi;
與其他語言中的Regex類似,模式中使用的所有元字元都必須轉義。Regex中的元字元包括:
( [ { \ ^ $ | ) ? * + .]}
這些元字元在Regex中都有一或多種特殊用途,因此如果想要匹配字串中包含的這些字元,
就必須對它們進行轉義。下面給出幾個例子。
/** 匹配第一個" [bc]at",不區分大小寫*/var pattern2 = /\[bc\]at/i;/** 匹配所有以"at"結尾的 3 個字元的組合,不區分大*/var pattern3 = /.at/gi;/** 匹配所有".at",不區分大小寫*/var pattern4 = /\.at/gi;
前面舉的這些例子都是以字面量形式來定義的Regex。另一種建立Regex的方式是使用
RegExp 建構函式,它接收兩個參數:一個是要匹配的字串模式,另一個是可選的標誌字串。可以
使用字面量定義的任何錶達式,都可以使用建構函式來定義,如下面的例子所示。
/** 匹配第一個"bat"或"cat",不區分大小寫*/var pattern1 = /[bc]at/i;/** 與 pattern1 相同,只不過是使用建構函式建立的*/var pattern2 = new RegExp("[bc]at", "i");
所有元字元都必須雙重轉義,那
些已經轉義過的字元也是如此,例如\n(字元\在字串中通常被轉義為\\,而在Regex字串中就
會變成\\\\)。下表給出了一些模式,左邊是這些模式的字面量形式,右邊是使用 RegExp 建構函式定義
相同模式時使用的字串。
使用Regex字面量和使用 RegExp 建構函式建立的Regex不一樣。在 ECMAScript 3 中,
Regex字面量始終會共用同一個 RegExp 執行個體,而使用建構函式建立的每一個新 RegExp 執行個體都是
一個新執行個體。來看下面的例子。
var re = null,i;for (i=0; i < 10; i++){re = /cat/g;re.test("catastrophe");}for (i=0; i < 10; i++){re = new RegExp("cat", "g");re.test("catastrophe");}
在第一個迴圈中,即使是迴圈體中指定的,但實際上只為/cat/建立了一個 RegExp 執行個體。由於實
例屬性(下一節介紹執行個體屬性)不會重設,所以在迴圈中再次調用 test()方法會失敗。這是因為第一
次調用 test()找到了"cat",但第二次調用是從索引為 3 的字元(上一次匹配的末尾)開始的,所以
就找不到它了。由於會測試到字串末尾,所以下一次再調用 test()就又從開頭開始了。
第二個迴圈使用 RegExp 建構函式在每次迴圈中建立Regex。因為每次迭代都會建立一個新的
RegExp 執行個體,所以每次調用 test()都會返回 true。
RegExp的執行個體屬性
RegExp 的每個執行個體都具有下列屬性,通過這些屬性可以取得有關模式的各種資訊。
? global:布爾值,表示是否設定了 g 標誌。
? ignoreCase:布爾值,表示是否設定了 i 標
? lastIndex:整數,表示開始搜尋下一個匹配
? multiline:布爾值,表示是否設定了 m 標誌
? source:Regex的字串表示,按照字面
通過這些屬性可以獲知一個Regex的各方面
在模式聲明中。例如:
var pattern1 = /\[bc\]at/i;alert(pattern1.global); //falsealert(pattern1.ignoreCase); //truealert(pattern1.multiline); //falsealert(pattern1.lastIndex); //0alert(pattern1.source); //"\[bc\]at"var pattern2 = new RegExp("\\[bc\\]at", "i");alert(pattern2.global); //falsealert(pattern2.ignoreCase); //truealert(pattern2.multiline); //falsealert(pattern2.lastIndex); //0alert(pattern2.source); //"\[bc\]at"
RegExp執行個體方法
JavaScript之RegExp對象