ECMAScript通過RegExp類型來支持正則表達式。
var expression = /pattern / flags;其中的模式(pattern)部分可以是任何簡單會復雜的正則表達式,可以包含字符類、限定符、分組、向前查找,以及反向引用。
每個正則表達式都可帶有一個或多個標志(flags),用以標明正則表達式的行為。
三個標志:
g ---表示全局模式,及模式將應用與所有字符串,而非發現的第一個匹配項的大小寫i ---表示不區分別大小寫模式,即在確定匹配時忽略模式與字符串的大小寫m---表示多行模式,即在到達一行文本末尾時還會繼續查找下一行中是否存在模式匹配的項一個表達式就是一個模式與上述三個標志的組合體。var pattern1 = /at/g //匹配字符串中所有“at”的實例var pattern2 = /[bc]at/i //匹配第一個''bat''或"cat",不區分大小寫var pattern3 =/.at/gi //匹配所有以"at"結尾的三個字符的組合,不區分大小寫模式中使用的所有元字符都必須轉義。正則表達式中的元字符包括:
( [ { \ ^ $ | ) ? * + . ] }這些元字符在正則表達式中都有一或多種特殊用途,因此如果想要匹配字符串中包含的這些字符,就必須對他們進行轉義var pattern1 = /[bc]at/i ; //匹配第一個“bat”或“cat”,不區分大小寫var pattern2 = /\[bc\]at/i; //匹配第一個"[bc]at",不區分大小寫var pattern3 = /.at/gi; //匹配所有以"at"結尾的3個字符的組合,不區分大小寫var pattern4 = /\.at/gi //匹配所有".at",不區分大小寫使用RegExp構造函數,兩個參數:要匹配的字符串模式,可選的標志字符串
RegExp實例屬性:var pattern1 = /[bc]at/i //匹配第一個"bat"或"cat",不區分大小寫var pattern2 = new RegExp("[bc]at","i"); //使用構造函數創建的不能把正則表達式字面量傳遞給RegExp構造函數由於RegExp構造函數的模式是字符串,所以在某些情況下要對字符進行雙重轉義。所有元字符都必須雙重轉義,那些已經轉義的字符也是如此/\[bc\]at/ "\\[bc\\]at"/\.at/ "\\.at"/name\/age/ "name\\/age"/\d.\d{1,2}/ "\\d.\\dP{1,2}"/\w\\hello\\123/ \\w\\\\hello\\\\123
RegExp的每個實例都具有下列實例,通過這些實例可獲得有關模式的信息;
這些信息全都包含在模式聲明中
- global ------布爾值,表示是否設置了g標志
- ignoreCase------布爾值,表示是否設置了i標志
- lastIndex------整數,表示開始搜索下一個匹配項的字符位置,從0開始
- multiline------布爾值,表示是否設置了m標志
- source-------正則表達式的字符串表示,按照字面量形式模式返回
RegExp實例方法:var pattern1 = /\[bc\]at/ialert(pattern1.global); //falsealert(pattern1.innoreCase); //truealert(pattern1.multiline); //falsealert(pattern1.lastIndex); //0alert(pattern1.source); //"\[bc\]at"var pattern2 = new RegExp("\\[bc\\]at","i")alert(pattern2.global); //falsesource屬性保存的是規范形式的字符串,即字面量形式所用的字符串
alert(pattern2.innoreCase); //true
alert(pattern2.multiline); //false
alert(pattern2.lastIndex); //0
alert(pattern2.source); //"\[bc\]at"
RegExp對象的主要方法是exec(),該方法是專門為捕獲組而設計的exec()接收一個參數,即要應用模式的字符串,然後返回包含第一個匹配項信息的數組;或者在沒有匹配項的情況下返回null返回的數組雖然是Array的實例,擔包含兩個額外屬性:index和input。index表示匹配項在字符串中的位置,input表示應用正則表達式的字符串在數組中,第一項是與整個模式匹配的字符串,其他項是與模式中的捕獲組匹配的字符串(如果沒有捕獲組,只包含一項)
var text = "mom and dad and baby";var pattern = /mom( and dad ( and baby)?)?/gi;var matches = pattern.exec(text);alert(matches.index); //0alert(matches.input); //"mom and dad and baby"alert(matches[0]); // "mom and dad and baby"alert(matches[1]); //"and dad and baby"alert(matches[2]); //"and baby"這個例子中包含兩個捕獲組,最內部的捕獲組匹配"and baby",而包含他的捕獲組匹配"and dad" 或者"and dad and baby"對於exec()方法而言,即使在模式中設置了全局標志(g),他每次也只會返回一個匹配項。在不設置全局標志的情況下,在同一個字符串上多次調用exec()將始終返回第一個匹配項的信息。在設置全局標志的情況下,每次調用exec()則都會在字符串中繼續查找新匹配項。
var text = "cat ,bat , sat , fat";var pattern1 = /.at/;var matches = pattern1.exec(text);alert(matches.index); //0alert(matches[0]); //catalert(pattern1.lastIndex); //3matches = pattern1.exec(text);alert(matches.index); //0alert(matches[0]); //catalert(pattern1.lastIndex); //3var pattern2 = /.at/g;正則表達式的第二個方法是test(),他接受一個字符串參數。在模式與該參數匹配的情況下返回true,否則,返回false。
var matches = pattern2.exec(text);
alert(matches.index); //0
alert(matches[0]); //cat
alert(pattern2.lastIndex); //0
matches = pattern2.exec(text);
alert(matches.index); //5
alert(matches[0]); //cat
alert(pattern2.lastIndex); //8
test()方法京城使用在if語句中
var text = "000-00-0000";var pattern = /\d{3}-\d{2}-\d{4}/;if(pattern.test(text)){
RegExp構造函數屬性:RegExp實例繼承的toLocaleString()和toString()方法都會返回正則表達式的字面量,與創建正則表達式的方式無關alert("The pattern was matched.");}
RegExp構造函數包含一些屬性。這些屬性適用於作用域中的所有正則表達式,並且基於所執行的最近一次正則表達式操作而變化。關於這些屬性的另一個獨特之外,就是可以通過兩種方式訪問它們。換句話說,這些屬性分別有一個長屬性名哈一個短屬性名(Opera是例外,它不支持短屬性名)。下表列出了RegExp構造函數的屬性。
長屬性名 短屬性名 說明 Input $_ 最近一次匹配的字符串。Opera未實現此屬性 lastMatch $& 最近一次的匹配項。Opera為實現此屬性 lastParen $+ 最近一次匹配的捕獲組 leftContext $` input字符串中lastMatch之前的文本 multiline $* 布爾值,表示是否所有表達式都使用多行模式
IE和Opera未實現此屬性 rightContext $’ input字符串中lastMatch之後的文本使用這些屬性可以從exec()或test()執行的操作中提取出更具體的信息。請看下面的例子:
var text = "this ha been a short summer"; var pattern = /(.)hort/g; if (pattern.test(text)) { alert(RegExp.input); //"this has been a short summer" alert(RegExp.leftContext); //"this has been a" alert(RegExp.rightContext); //" summer" alert(RegExp.lastMatch); //"short" alert(RegExp.lastParen); //"s" alert(RegExp.multiline); // false }以上代碼創建了一個模式,匹配任何一個字符後跟hort,而且把第一個字符放在了一個捕獲組中。RegExp構造函數的各個屬性返回了下列值:
- input 屬性返回了原始字符串;
- leftContext屬性返回了單詞short之前的字符串,而rightContext屬性返回了short之後的字符串;
- lastMatch屬性返回最近一次與整個正則表達式匹配的字符串,即short
- lastParen屬性返回最近一次匹配的捕獲組,即例子中的s
如前所述,例子使用的長屬性名都可以用相應的短屬性名來代替。只不過,由於這些短屬性名大都不是有效的ECMAScript標識符,因此必須通過方括號法來訪問它們,如下所示:
var text = "this has been short summer"; var pattern = /(.)hort/g; if (pattern.test(text)) { alert(RegExp.$_); //this has been a short summer alert(RegExp["$`"]); //this has been a alert(RegExp["s'"]); //summer alert(RegExp["$&"]); //short alert(RegExp["$+"]); //s alert(RegExp["$*"]); //false }除了上面介紹的幾個屬性之外,還有多達9個用於存儲捕獲組的構造函數屬性。訪問這些屬性的語法是RegExp.$1、RegExp.$2…RegExp.$9,分別用於存儲第一,第二……第九個匹配的的捕獲組。在調用exec()或test()方法時,這些屬性會被自動填充。然後,我們就可以像下面這樣來使用它們:
var text = "this has been a short summer"; var pattern = /(..)or(.)/g; if (pattern.test(text)) { alert(RegExp.$1); //sh alert(RegExp.$2); //t }這裡創建了一個包含兩個捕獲組的模式,並用該模式測試了一個字符串。即使test()方法值返回一個布爾值,但RegExp構造函數的屬性$1和$2也會被匹配相應捕獲組的字符串自動填充。