1. 程式人生 > >JavaScript中的RegExp型別

JavaScript中的RegExp型別

RegExp

ECMAScript 通過 RegExp 型別來支援正則表示式。


建立 RegExp

建立正則表示式語法:

var expression = / pattern / flags ;

其中的模式(pattern)部分可以是任何簡單或複雜的正則表示式,可以包含字元類、限定符、分組、向前查詢及反向引用。每個正則表示式都可以帶有一或多個標誌(flags),用以標明正則表示式的行為。

關於正則表示式語法可看這個:正則表示式
正則表示式的匹配模式支援 3 個標誌:

  • g:表示全域性(global)模式,即模式將被應用於所有字串,而非在發現第一個匹配項時立即停止。
  • i:表示不區分大小寫(case-insensitive)模式,即在確定匹配項時忽略模式與字串的大小寫。
  • m:表示多行(multiline)模式,即在到達一行文字末尾時還會繼續查詢下一行中是否存在與模式匹配的項。

例如:

// 匹配字串中所有“at”的例項
var pattern1 = /at/g
// 匹配第一個“bat”或者“cat”,不區分大小寫
var pattern2 = /[bc]at/i
// 匹配所有的以“at”結尾的 3 個字元的組合,不區分大小寫
var pattern3 = /.at/gi

轉義

與其他語言中的正則表示式類似,模式中使用的所有元字元都必須轉義。正則表示式中的元字元包括:

( [ { \ ^ $ | ) ? * + . ] }

例如:

// 匹配第一個“bat”或者“cat”
var pattern2 = /[bc]at/
// 匹配第一個“[bc]at”
var pattern4 = /\[bc\]at/

RegExp 建構函式

上面的例子都是使用字面量表示法來定義的正則表示式,也可以使用 RegExp 建構函式來定義。建構函式接收兩個引數:一個是要匹配的字串模式,一個是可選的標誌字串。

要注意的是,傳遞給 RegExp 建構函式的兩個引數都是字串,由於 RegExp 建構函式的模式引數也是字串,所以在某些情況下要對字元進行雙重轉義。


RegExp 例項屬性

RegExp 的每個例項都具有以下屬性,通過這些屬性可以取得有關模式的各種資訊。

  • global:布林值,表示是否設定了 g 標誌
  • ignoreCase:布林值,表示是否設定了 i 標誌
  • multiline:布林值,表示是否設定了 m 標誌
  • lastIndex:整數,表示開始搜尋下一個匹配項的字元位置
  • source:正則表示式的字串表示,按照字面量形式而非傳入建構函式中的字串模式返回
var pattern = /\[bc\]at/gi

alert(pattern.global)       // true
alert(pattern.ignoreCase)   // true
alert(pattern.multiline)    // false
alert(pattern.lastIndex)    // 0
alert(pattern.source)       // "\[bc\]at"

不論是使用字面量還是建構函式,他們的 source 屬性是相同的,都是字面量形式所用的字串。


RegExp 例項方法

1. exec ( )

exec ( ) 是 RegExp 物件的主要方法,專門為捕獲組而設計的。

exec ( ) 接收一個引數,即要應用模式的字串,然後返回包含第一個匹配項資訊的陣列;或在沒有匹配項的情況下返回 null。

該方法返回的陣列雖然是 Array 的例項,但包含兩個額外的屬性:index 和 input。其中,index 表示匹配項在字串中的位置,input 表示應用正則表示式的字串。
在返回的陣列中,第一項是與整個模式匹配的字串,其他項是與模式中的捕獲組(不懂捕獲組點這裡)匹配的字串(如果沒有捕獲組,則該陣列只包含一項)。

對於 exec ( ) 而言,即使在模式中設定了全域性標誌(g),他每次也只會返回一個匹配項。在不設定全域性標誌的情況下,在同一個字串上多次呼叫 exec ( ) 將始終返回第一個匹配項的資訊。而在設定全域性標誌的情況下,每次呼叫 exec ( ) 則都會在字串中繼續查詢新匹配項。

例如:

var text = "cat, bat, sat, fat";
var pattern1 = /.at/
var pattern2 = /.at/g

var matches1 = pattern1.exec(text)
alert(matches1.index)       // 0
alert(matches1[0])          // cat
alert(pattern1.lastIndex)   // 0

matches1 = pattern1.exec(text)
alert(matches1.index)       // 0
alert(matches1[0])          // cat
alert(pattern1.lastIndex)   // 0

var matches2 = pattern2.exec(text)
alert(matches2.index)       // 0
alert(matches2[0])          // cat
alert(pattern2.lastIndex)   // 3

matches2 = pattern2.exec(text)
alert(matches2.index)       // 5
alert(matches2[0])          // bat
alert(pattern2.lastIndex)   // 8

在上面的例子中我們也可以發現,lastIndex 屬性,在全域性模式下每次呼叫值都會改變,而在非全域性模式下則保持不變。

2. test ( )

test( ) 方法接收一個字串引數,在模式與該引數匹配的情況下返回 true,否則返回 false。

在只想知道目標字串與某個模式是否匹配,但不需要知道具體文字內容時,一般使用這個方法。因此這個方法常用在 if 語句中。

例如:

var text = "000-00-0000"
var pattern = /\d{3}-\d{2}-\d{4}/

if(pattern.test(text)){
    alert("mateched!")
}

3. 繼承方法

  • toString ( ) 和 toLocalString ( ) 這兩個方法都會返回正則表示式的字面量,不論是用哪種方式建立。
  • 正則表示式的 valueOf ( ) 方法返回正則表示式本身。
var text = "000-00-0000"
var pattern = /\d{3}-\d{2}-\d{4}/

var valParteen = pattern.valueOf()

alert(pattern.toString())   // /\d{3}-\d{2}-\d{4}/

alert(valParteen)   // /\d{3}-\d{2}-\d{4}/
alert(typeof(valParteen))   // object
alert(valParteen instanceof RegExp) // true