正則方法和屬性的使用---包括你沒有見過的哦

前言

    上篇文章咱們看正則的一些正常使用和一些須要記憶的元字符。接下來將展現正則的實例、方法、以及大家沒有見過的屬性。

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表示應用正則表達式的字符串。在數組中,第一項是整個個正則匹配的字符串,其餘項是與正則中分組匹配的字符串(若是該正則沒有分組捕獲,則該數組只包含一項)。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構造函數函數的屬性

     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也會返匹配響應捕獲組的字符串自動填充

RegExp的侷限性

      儘管 ECMAScript 中的正則表達式功能仍是比較完備的,但仍然缺乏某些語言(特別是 Perl)所支 持的高級正則表達式特性。下面列出了 ECMAScript 正則表達式不支持的特性(要了解更多相關信息, 請訪問 www.regular-expressions.info)。
  • 匹配字符串開始和結尾\A和\Z(但支持以插入符號(^)和美圓符號($)來匹配字符串的開始和結尾)
  • 向後查找(但徹底支持向前查找(lookahead)。)
  • 並集和交集
  • 原子組
  • Unicode 支持(單個字符除外,如\uFFFF)
  • 命名的捕獲組 (但支持編號的捕獲組。)
  • s(single,單行)和 x(free-spacing,無間隔)匹配模式
  • 條件匹配
  • 正則表達式註釋

** 即便存在這些限制,ECMAScript 正則表達式仍然是很是強大的,可以幫咱們完成絕大多數模式匹 配任務。這些屬性中小夥伴們是否是有好多沒有見過的**

相關文章
相關標籤/搜索