JS數據類型之RegExp類型

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.1RegExp. 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
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章