經過這些屬性能夠獲知一個正則表達式的各方面信息,可是卻沒有大用處,由於這些信息全都包含在模式聲明中。例如:正則表達式
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對象的主要方法是exec(),該方法專門爲捕獲」組「而設計的。exec()接受一個參數,要被匹配捕獲的字符串,而後返回包含第一個匹配信息的數組;或者在沒有匹配人會狀況下返回null。返回的數組雖然是Array的實例,但包含兩個額外的屬性;index和input。其中index表示匹配項在字符中的位置,而input表示應用正則表達式的字符串。在數組中,第一項是整個個正則匹配的字符串,其餘項是與正則中分組匹配的字符串(若是該正則沒有分組捕獲,則該數組只包含一項)。express
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()則都返回在字符串中繼續查找新的匹配項bash
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中ui
var text = '000-00-0000';
var reg = /\d{3}-\d{2}-\d{4}/;
if(reg.test(test)){}
console.log('The pattern was matched.')
複製代碼
相信小夥伴們對上面的屬性和方法很熟悉,接下來看看,我們都不太熟悉的屬性吧this
RegExp構造函數包含一些屬性(這些屬性在其餘的語言版本中當作是靜態屬性)。這些屬性適合於全部的正則表達式,並基於所執行的最後一次正則表達式操做而變化。關於這些屬性的另外一個獨特之處,能夠經過兩種方式範文他們。換句話來講,這些屬性分別有一個長屬性名和一個短屬性名(opera是個例外,它不支持短屬性名)。下面列出構造函數的屬性spa
長屬性名稱 短屬性名稱 說明設計
input $_ 最近一次要匹配的字符串。Opera未實現此屬性
code
lastMatch $& 最近一次要匹配項。Opera未實現此屬性
lastParent $+ 最近一次匹配的捕獲組。Opera未實現此屬性
leftContent $` input字符串中lastMatch以前的文本。
multiline $* 布爾值,表示是否全部表達式都使用多行模式。IE和Opera未實現此屬性
rightContent $' Input字符串中lastMatch以後的文
除了上面簡介的幾個屬性以外,還有多達9個用於存儲捕獲的組的構造函數屬性。訪問這些屬性的語法使RegExp.$一、RegExp.$二、RegExp.$三、RegExp.$四、......RegExp.$9,分別用於存儲第1、第2、第三.......第九個匹配的捕獲組。在調用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也會返匹配響應捕獲組的字符串自動填充
** 即便存在這些限制,ECMAScript 正則表達式仍然是很是強大的,可以幫咱們完成絕大多數模式匹 配任務。這些屬性中小夥伴們是否是有好多沒有見過的**