前言
上篇文章我們看正則的一些正常使用和一些需要記憶的元字元。接下來將展示正則的例項、方法、以及你們沒有見過的屬性。RegExp的例項和屬性
RegExp的每個例項都具有下列屬性,通過這些屬性可以取得關鍵的各中資訊。- global : 布林值,表示是否設定了g標誌。
- ignoreCase:布林值,表示是否設定了i標誌。
- lastIndex:整數,表示開始搜尋下一個匹配項字串位置,從0起。
- multiline:布林值,表示是否設定了m標誌。
- source: 正規表示式的字串表示,按照字面量形式表示而非傳入建構函式中的字串模式返回。
通過這些屬性可以獲知一個正規表示式的各方面資訊,但是卻沒有大用處,因為這些資訊全都包含在模式宣告中。例如:
var reg = /\[bc\]at/i;
console.log(reg.global);// false
console.log(reg.igoreCase);//true
console.log(reg.miltiline);//false
console.log(reg.lastIndex);//0
console.log(reg.source);//'\[bc\]at'
var reg1 = new RegExp('\\[bc\\]',i);
console.log(reg1.global);// false
console.log(reg1.igoreCase);//true
console.log(reg1.miltiline);//false
console.log(reg1.lastIndex);//0
console.log(reg1.source);//'\[bc\]at'
複製程式碼
RegExp的例項方法
RegExp物件的主要方法是exec(),該方法專門為捕獲”組“而設計的。exec()接受一個引數,要被匹配捕獲的字串,然後返回包含第一個匹配資訊的陣列;或者在沒有匹配人會情況下返回null。返回的陣列雖然是Array的例項,但包含兩個額外的屬性;index和input。其中index表示匹配項在字元中的位置,而input表示應用正規表示式的字串。在陣列中,第一項是整個個正則匹配的字串,其他項是與正則中分組匹配的字串(如果該正則沒有分組捕獲,則該陣列只包含一項)。
var text = 'mom and dad and baby';
var reg = /mom(and dad(and baby)?)?/gi;
var matches = reg.exec(text);
conole.log(matches.index);//0
conole.log(matches.input);//'mom and dad and baby'
conole.log(matches[0]);//'mom and dad and baby'
conole.log(matches[1]);//'and dad and baby'
conole.log(matches[2]);//'and baby'
複製程式碼
上面的例子是不是驗證我們們說的匹配規則,exec() 方法執行的結果,如果正則匹配成功就會返回一個陣列(陣列的index,表示正則匹配的位於字串的位置,陣列的第一項是整個正則匹配的內容,陣列的第二項是正則第一個分組捕獲內容,第三項,是正則第二個分組捕獲內容),不成功就會返回一個null。
對於exec()方法而言,即使在正則中設定了全域性模式g,它每次也會返回一個匹配項資訊。在沒有設定全域性標誌的情況下,在同一個字串多次呼叫exec()將始終返回第一個匹配項的資訊。而咋設定全域性標誌的情況下,每次都呼叫exec()則都返回在字串中繼續查詢新的匹配項
var text = 'cat,bat,sat,fat';
var reg = /.at/;
var res = reg.exec(text)
console.log(res.index);//0
console.log(res[0]);//cat
console.log(res.lastIndex);//0
res = reg.exec(text)
console.log(res.index);//0
console.log(res[0]);//cat
console.log(res.lastIndex);//0
reg = /.at/g;
var res = reg.exec(text)
console.log(res.index);//0
console.log(res[0]);//cat
console.log(res.lastIndex);//3
var res = reg.exec(text)
console.log(res.index);//5
console.log(res[0]);//bat
console.log(res.lastIndex);//8
var res = reg.exec(text)
console.log(res.index);//10
console.log(res[0]);//sat
console.log(res.lastIndex);//13
var res = reg.exec(text)
console.log(res.index);//15
console.log(res[0]);//fat
console.log(res.lastIndex);//18
var res = reg.exec(text)
console.log(res.index);//19
console.log(res);//null
console.log(res.lastIndex);//19
複製程式碼
切記在使用正則exec()方法的時候,想不斷的匹配整個字串的話,需要新增i標誌IE 的 JavaScript 實現在 lastIndex 屬性上存在偏差,即使在非全域性模式下, lastIndex 屬性每次也會變化。
正規表示式的第二個方法 test(),它就是一個字串引數,在能匹配成功的情況下返回 true,否則返回false。在只想知道目標字串與該正則是否匹配的情況下,使用這個方法非常方便。因此,test常用在if中
var text = '000-00-0000';
var reg = /\d{3}-\d{2}-\d{4}/;
if(reg.test(test)){}
console.log('The pattern was matched.')
複製程式碼
相信小夥伴們對上面的屬性和方法很熟悉,接下來看看,我們們都不太熟悉的屬性吧
RegExp建構函式函式的屬性
RegExp建構函式包含一些屬性(這些屬性在其他的語言版本中看成是靜態屬性)。這些屬性適合於所有的正規表示式,並基於所執行的最後一次正規表示式操作而變化。關於這些屬性的另一個獨特之處,可以通過兩種方式範文他們。換句話來說,這些屬性分別有一個長屬性名和一個短屬性名(opera是個例外,它不支援短屬性名)。下面列出建構函式的屬性
長屬性名稱 短屬性名稱 說明
input $_ 最近一次要匹配的字串。Opera未實現此屬性
lastMatch $& 最近一次要匹配項。Opera未實現此屬性
lastParent $+ 最近一次匹配的捕獲組。Opera未實現此屬性
leftContent $` input字串中lastMatch之前的文字。
multiline $* 布林值,表示是否所有表示式都使用多行模式。IE和Opera未實現此屬性
rightContent $' Input字串中lastMatch之後的文
除了上面簡介的幾個屬性之外,還有多達9個用於儲存捕獲的組的建構函式屬性。訪問這些屬性的語法使RegExp.$1、RegExp.$2、RegExp.$3、RegExp.$4、......RegExp.$9,分別用於儲存第一、第二、第三.......第九個匹配的捕獲組。在呼叫exec()或test()方法時,這些屬性會被自動填充。然後我們就可以這樣使用它們。
var text = 'this has benn a short summer';
var reg = /(..)or(.)/g;
if(reg.test(text)){
console.log(RegExp.$1)// sh
console.log(RegExp.$2)//t
}
複製程式碼
這裡建立一個包含兩個捕獲組正則,並用正則的test()方法去匹配該字串,雖然test()方法只返回一個布林值,單Regxp建構函式的屬性$1和$2也會返匹配響應捕獲組的字串自動填充
RegExp的侷限性
儘管 ECMAScript 中的正規表示式功能還是比較完備的,但仍然缺少某些語言(特別是 Perl)所支 持的高階正規表示式特性。下面列出了 ECMAScript 正規表示式不支援的特性(要了解更多相關資訊, 請訪問 www.regular-expressions.info)。- 匹配字串開始和結尾\A和\Z(但支援以插入符號(^)和美元符號($)來匹配字串的開始和結尾)
- 向後查詢(但完全支援向前查詢(lookahead)。)
- 並集和交集
- 原子組
- Unicode 支援(單個字元除外,如\uFFFF)
- 命名的捕獲組 (但支援編號的捕獲組。)
- s(single,單行)和 x(free-spacing,無間隔)匹配模式
- 條件匹配
- 正規表示式註釋
** 即使存在這些限制,ECMAScript 正規表示式仍然是非常強大的,能夠幫我們完成絕大多數模式匹 配任務。這些屬性中小夥伴們是不是有好多沒有見過的**