JS RegExp的範例屬性(成員屬性)和靜態屬性

2020-07-16 10:05:03
正規表示式 RegExp 型別擁有多個範例屬性(也叫成員屬性)和靜態屬性,通過它們能夠了解正規表示式的一些情況。

RegExp 範例屬性

每個正規表示式物件都包含一組屬性,說明如表所示。

RegExp 物件屬性
屬性 說明
global 返回 Boolean 值,檢測 RegExp 物件是否具有標誌 g
ignoreCase 返回 Boolean 值,檢測 RegExp 物件是否具有標誌 i
multiline 返回 Boolean 值,檢測 RegExp 物件是否具有標誌 m
lastIndex 一個整數,返回或者設定執行下一次匹配的下標位置
source 返回正規表示式的字元模式原始碼

global、ignoreCase、multiline 和 source 屬性都是唯讀屬性。lastIndex 屬性可讀可寫,通過設定該屬性,可以定義匹配的起始位置。

範例

下面範例演示了如何讀取正規表示式物件的基本資訊,以及 lastIndex 屬性在執行匹配前後的變化。
var s = "JavaScript";  //測試字串
var r = /w/g;  //匹配模式
console.log("r.global = " + r.global);  //true
console.log("r.ignoreCase = " + r.ignoreCase);  //返回true
console.log("r.multiline = " + r.multiline);  //返回false
console.log("r.source= " + r.source);  //返回a
console.log("r.lastIndex = " + r.lastIndex);  //返回0
r.exec(s);  //執行匹配操作
console.log("r.lastIndex = " + r.lastIndex);  //返回1

RegExp 靜態屬性

RegExp 型別包含一組靜態屬性,通過 RegExp 物件直接存取。這組屬性記錄了當前指令碼中最新正規表示式匹配的詳細資訊,說明如表所示。

這些靜態屬性大部分有兩個名字:長名(全稱)和短名(簡稱,以 $ 開頭表示)。

RegExp 靜態屬性
長名 短名 說明
input $_ 返回當前所作用的字串,初始值為空字串""
index   當前模式匹配的開始位置,從 0 開始計數。初始值為 -1,每次成功匹配時,index 屬性值都會隨之改變
lastIndex   當前模式匹配的最後一個字元的下一個字元位置,從 0 開始計數,常被作為繼續匹配的起始位置。初始值為 -1,表示從起始位置開始搜尋,每次成功匹配時,lastIndex 屬性值都會隨之改變
lastMatch $& 最後模式匹配的字串,初始值為空字串""。在每次成功匹配時,lastMatch 屬性值都會隨之改變
lastParen $+ 最後子模式匹配的字串,如果匹配模式中包含有子模式(包含小括號的子表示式),在最後模式匹配中,最後一個子模式所匹配到的子字串。初始值為空字串""。在每次成功匹配時,lastParen屬性值都會隨之改變
leftContext $` 在當前所作用的字串中,最後模式匹配的字串左邊的所有內容。初始值為空字串""。每次匹配成功時,其屬性值都會隨之改變
rightContext $' 在當前所作用的字串中,最後模式匹配的字串右邊的所有內容。初始值為空字串""。每次匹配成功時,其屬性值都會隨之改變
$1~$9 $1~$9 唯讀屬性,如果匹配模式中有小括號包含的子字串,$1~$9 屬性值分別是第 1 個到第 9 個子模式所匹配到的內容。如果有超過 9 個以上的子模式,$1~$9 屬性分別對應最後的 9 個子模式匹配結果。在一個匹配模式中,可以指定任意多個小括號包含的子模式,但 RegExp 靜態屬性只能儲存最後 9 個子模式匹配的結果。在 RegExp 範例物件的一些方法所返回的結果陣列中,可以獲得所有圓括號內的子匹配結果

範例1

下面範例演示了 RegExp 型別靜態屬性使用,匹配字串“JavaScript”。
var s = "JavaScript, not JavaScript";
var r = /(Java)Script/gi;
var a = r.exec(s);  //執行匹配操作
console.log(RegExp.input);  //返回字串“JavaScript, not JavaScript”
console.log(RegExp.leftContext);  //返回空字串,左側沒有內容
console.log(RegExp.rightContext);  //返回字串“,not JavaScript”
console.log(RegExp.lastMatch);  //返回字串“JavaScript”
console.log(RegExp.lastParen);  //返回字串“Java”
執行匹配操作後,各個屬性的返回值說明如下:
  • input 屬性記錄操作的字串:“JavaScript, not JavaScript”。
  • leftContext 屬性記錄匹配文字左側的字串在第一次匹配操作時,左側文字為空。而 rightContext 屬性記錄匹配文字右側的文字,即為“,not JavaScript”。
  • lastMatch 屬性記錄匹配的字串,即為“JavaScript”。
  • lastParen 屬性記錄匹配的分組字串,即為“Java”。

如果匹配模式中包含多個子模式,則最後一個子模式所匹配的字元就是“RegExp.lastParen”。
var r = /(Java)(Script)/gi;
var a = r.exec(s);  //執行匹配操作
console.log(RegExp.lastParen);  //返回字串“Script”,而不再是“Java”。

範例2

針對上面範例也可以使用短名來讀取相關資訊。
var s = "JavaScript, not JavaScript";
var r = /(Java)(Script)/gi;
var a = r.exec(s);
console.log(RegExp.$_);  //返回字串“JavaScript, not JavaScript”
console.log(RegExp["$`"]);  //返回空字串
console.log(RegExp["$'"]);  //返回字串“,not JavaScript”
console.log(RegExp["$&"]);  //返回字串“JavaScript”
console.log(RegExp["$+"]);  //返回字串“Script”
這些屬性的值都是動態的,在每次執行匹配操作時,都會被重新設定。