RegExp對象

正則表達式

/pattern/flags new RegExp(pattern [, flags])javascript

pattern 正則表達式的文本
flags 若是指定,標誌能夠具備如下值的任意組合:
g 全局匹配
i 忽略大小寫
m 多行;讓開始和結束字符(^ 和 $)工做在多行模式工做
u Unicode。把模式看成Unicode代碼點(code points)的序列。
y 黏度; 在目標字符串中,只從正則表達式的lastIndex屬性指定的顯示位置開始匹配(而且不試圖從任何以後的索引匹配)。
//字面量
var regex = /xyz/i;
//構造函數
var regex = new RegExp('xyz', "i");

這兩種寫法——字面量和構造函數——在運行時有一個細微的區別。採用字面量的寫法,正則對象在代碼載入時(即編譯時)生成;採用構造函數的方法,正則對象在代碼運行時生成。考慮到書寫的便利和直觀,實際應用中,基本上都採用字面量的寫法。html

匹配規則

MDN
javascript標準參考教程java

正則對象的屬性和方法

<h4>屬性</h4>
正則對象的屬性分紅兩類。
一類是修飾符相關,返回一個布爾值,表示對應的修飾符是否設置。正則表達式

ignoreCase:返回一個布爾值,表示是否設置了i修飾符,該屬性只讀。
global:返回一個布爾值,表示是否設置了g修飾符,該屬性只讀。
multiline:返回一個布爾值,表示是否設置了m修飾符,該屬性只讀。express

var r = /abc/igm;

r.ignoreCase // true
r.global // true
r.multiline // true

另外一類是與修飾符無關的屬性,主要是下面兩個。數組

lastIndex:返回下一次開始搜索的位置。該屬性可讀寫,可是隻在設置了g修飾符時有意義。
source:返回正則表達式的字符串形式(不包括反斜槓),該屬性只讀。函數

var r = /abc/igm;

r.lastIndex // 0
r.source // "abc"

<h4>方法</h4>
test() 正則對象的test方法返回一個布爾值,表示當前模式是否能匹配參數字符串。ui

若是正則表達式帶有g修飾符,則每一次test方法都從上一次結束的位置開始向後匹配。prototype

var r = /x/g;
var s = '_x_x';

r.lastIndex // 0
r.test(s) // true

r.lastIndex // 2
r.test(s) // true

r.lastIndex // 4
r.test(s) // false

//lastIndex屬性只對同一個正則表達式有效,因此下面這樣寫是錯誤的

var count = 0;
while (/a/g.test('babaa')) count++;

exec() 正則對象的exec方法,能夠返回匹配結果。若是發現匹配,就返回一個數組,成員是每個匹配成功的子字符串,不然返回null。code

若是正則表示式包含圓括號(即含有「組匹配」),則返回的數組會包括多個成員。第一個成員是整個匹配成功的結果,後面的成員就是圓括號對應的匹配成功的組。也就是說,第二個成員對應第一個括號,第三個成員對應第二個括號,以此類推。整個數組的length屬性等於組匹配的數量再加1。

var s = '_x_x';
var r = /_(x)/;

r.exec(s) // ["_x", "x"]

若是正則表達式加上g修飾符,則可使用屢次exec方法,下一次搜索的位置從上一次匹配成功結束的位置開始。

//exec方法的返回數組還包含如下兩個屬性:
//    input:整個原字符串。
//    index:整個模式匹配成功的開始位置(從0開始計數)。

var r = /a(b+)a/g;

var a1 = r.exec('_abbba_aba_');
a1 // ['abbba', 'bbb']
a1.index // 1
r.lastIndex // 6

var a2 = r.exec('_abbba_aba_');
a2 // ['aba', 'b']
a2.index // 7
r.lastIndex // 10

var a3 = r.exec('_abbba_aba_');
a3 // null
a3.index // TypeError: Cannot read property 'index' of null
r.lastIndex // 0

var a4 = r.exec('_abbba_aba_');
a4 // ['abbba', 'bbb']
a4.index // 1
r.lastIndex // 6

字符串對象的方法

字符串對象的方法之中,有4種與正則對象有關。

match():返回一個數組,成員是全部匹配的子字符串。
search():按照給定的正則表達式進行搜索,返回一個整數,表示匹配開始的位置。
replace():按照給定的正則表達式進行替換,返回替換後的字符串。
split():按照給定規則進行字符串分割,返回一個數組,包含分割後的各個成員。

//String.prototype.match()

var s = 'abba';
var r = /a/g;
s.match(r) // ["a", "a"]
r.exec(s) // ["a"]
//String.prototype.search()

'_x_x'.search(/x/)
//String.prototype.replace()

'aaa'.replace('a', 'b') // "baa"
'aaa'.replace(/a/, 'b') // "baa"
'aaa'.replace(/a/g, 'b') // "bbb"

//replace方法的第二個參數可使用美圓符號$,用來指代所替換的內容。
//    $& 指代匹配的子字符串。
//    $` 指代匹配結果前面的文本。
//    $' 指代匹配結果後面的文本。
//    $n 指代匹配成功的第n組內容,n是從1開始的天然數。
//    $$ 指代美圓符號$。
  
'hello world'.replace(/(\w+)\s(\w+)/, '$2 $1')
// "world hello"

'abc'.replace('b', '[$`-$&-$\']')
// "a[a-b-c]c"


//replace方法的第二個參數還能夠是一個函數,將每個匹配內容替換爲函數返回值。

'3 and 5'.replace(/[0-9]+/g, function(match){
  return 2 * match;
})
// "6 and 10"

var a = 'The quick brown fox jumped over the lazy dog.';
var pattern = /quick|brown|lazy/ig;

a.replace(pattern, function replacer(match) {
  return match.toUpperCase();
});
// The QUICK BROWN fox jumped over the LAZY dog.
//String.prototype.split()

// 非正則分隔
'a,  b,c, d'.split(',')
// [ 'a', '  b', 'c', ' d' ]

// 正則分隔,去除多餘的空格
'a,  b,c, d'.split(/, */)
// [ 'a', 'b', 'c', 'd' ]

// 指定返回數組的最大成員
'a,  b,c, d'.split(/, */, 2)
[ 'a', 'b' ]

'aaa*a*'.split(/(a*)/)
// [ '', 'aaa', '*', 'a', '*' ]
相關文章
相關標籤/搜索