RegExp 類型
ECMAScript通過RegExp類型來支持正則表達式。使用下面類似Perl的語法,就可以創建一個正則表達式。
var expression=/pattern/flags;
其中的模式(pattern)部分可以是任何簡單或複雜的正則表達式,可以包含字符類、限定符、分組、向前查找以及反向引用。每個正則表達式都可帶有一或多個標誌(flags),用以標明正則表達式的行爲。
正則表達式支持下列3個標誌。
- g:表示全局(global)模式,即模式將被應用於所有字符串,而不是在發現第一個匹配項時就停止。
- i:表示不區分大小寫(case-insensitive)模式
- m:表示多行(multiline)模式
var pattern1=/at/g; //匹配字符串中所有"at"的實例
var pattern2=/[bc]at/i; //匹配第一個"bat"或"cat",不區分大小寫
var pattern3=/.at/gi; //匹配所有以"at"結尾的3個字符的組合,不區分大小寫
元字符
模式中使用的所有元字符都必須轉義。這些元字符包括:
( [ { \ ^ $ | ) ? * + . ] }
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構造函數
var pattern1=/[bc]at/i; //匹配第一個"bat"或"cat",不區分大小寫
var pattern2=new RegExp("[bc]at","i"); //與pattern1相同,只不過是使用構造函數創建的
但是要注意的是,傳遞給RegExp構造函數的兩個參數都是字符串(不能把正則表達式字面量傳遞給RegExp構造函數)。由於RegExp構造函數的模式參數是字符串,所以在某些情況下要對字符進行雙重轉義。
下表給出了一些模式,左邊是這些模式的字面量形式,右邊是使用RegExp構造函數定義相同模式時使用的字符串。
字面量模式 | 等價的字符串 |
---|---|
\.at | “\\.at” |
RegExp實例屬性
RegExp的每個實例都具有下列屬性,通過這些屬性可以取得有關模式的各種信息
- global:布爾值,表示是否設置了g標誌
- ignoreCase:布爾值,表示是否設置了i標誌
- lastIndex:整數,表示開始搜索下一個匹配項的字符位置,從0算起
- multiline:布爾值,表示是否設置了m標誌
- source:正則表達式的字符串表示,按照字面量形式而非傳入構造函數中的字符串模式返回
var pattern=/\[bc\]at/i;
alert(pattern1.global); //false
alert(pattern1.ignoreCase); //true
alert(pattern1.multiline); //false
alert(pattern1.lastIndex); //0
alert(pattern1.source); //"\[bc\]at"
var pattern2=new RegExp("\\[bc\\]at","i");
alert(pattern2.global); //false
alert(pattern2.ignoreCase); //true
alert(pattern2.multiline); //false
alert(pattern2.lastIndex); //0
alert(pattern2.source); //"\[bc\]at"
RegExp實例方法
1、exec(),該方法是專門爲捕獲組而設計的。exec()接受一個參數,即要應用模式的字符串,然後返回第一個匹配項信息的數組;或者在沒有匹配項的情況下返回null
var text="mom and dad and baby";
var pattern=/mom(and dad(and baby)?)?/gi;
var matches=pattern.exec(text);
alert(matches.index); //0
alert(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"
對於exec()方法而言,即使在模式中設置了全局標誌(g),它每次也只返回一個匹配項。在不設置全局標誌的情況下,在同一個字符串上多次調用exec()始終返回第一個匹配項的信息。而在設置全局標誌的情況下,每次調用exec()則都會在字符串中繼續查找新匹配項。
2、test(),它接受一個字符串參數。在模式與該參數匹配的情況下返回true;否則,返回false。在只想知道目標字符串與某個模式是否匹配,但不需要知道其文本內容的情況下,使用這個方法非常方便。因此,test()方法經常被用在if語句中,如下面的例子所示。
var text="000-00-000-0000";
var pattern=/\d{3}-\d{2}-\d{4}/;
if(pattern.test(text)){
alert("The pattern was matches.");
}
RegExp實例繼承的toLocaleString()和toString()方法都會返回正則表達式的字面量,與創建正則表達式的方式無關。如:
var pattern=new RegExp("\\[bc\\]at","gi");
alert(pattern.toString()); // /\[bc\]at/gi
alert(pattern.toLocaleString()); // /\[bc\]at/gi
RegExp構造函數屬性
RegExp構造函數的屬性
長屬性名 | 短屬性名 | 說明 |
---|---|---|
input | $_ | 最近一次要匹配的字符串。Opera爲實現此屬性 |
lastMatch | $& | 最近一次的匹配項。Opera未實現此屬性 |
lastParen | $+ | 最近一次匹配的捕獲組。Opera未實現此屬性 |
leftContext | $` | input字符串中lastMatch之前的文本 |
multiline | $* | 布爾值,表示是否所有表達式都使用多行模式。IE和Opera未實現此屬性 |
rightContext | $’ | Input字符串中lastMatch之後的文本 |
使用這些屬性可以從exec()或test()執行的操作中提取出更具體的信息。
var text="this has 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
}
用短屬性名標識如下
var text="this has been a 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["$'"]); //summer
alert(RegExp["$&"]); // short
alert(RegExp["$+"]); //s
alert(RegExp["$*"]); //false
}
除了上面介紹的幾個屬性之外,還有多達9個用於存儲捕獲組的構造函數屬性。訪問這些屬性的語法是RegExp.
var text="this has been a short summer";
var pattern=/(..)or(.)/g;
if(pattern.test(text)){
alert(RegExp.$1); //sh
alert(RegExp.$2); //t
}