正則實例對象的`test`方法返回一個布爾值,表示當前模式是否能匹配參數字符串。
~~~
/cat/.test('cats and dogs') // true
~~~
上面代碼驗證參數字符串之中是否包含`cat`,結果返回`true`。
如果正則表達式帶有`g`修飾符,則每一次`test`方法都從上一次結束的位置開始向后匹配。
~~~
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
~~~
上面代碼的正則表達式使用了`g`修飾符,表示是全局搜索,會有多個結果。接著,三次使用`test`方法,每一次開始搜索的位置都是上一次匹配的后一個位置。
帶有`g`修飾符時,可以通過正則對象的`lastIndex`屬性指定開始搜索的位置。
~~~
var r = /x/g;
var s = '_x_x';
r.lastIndex = 4;
r.test(s) // false
r.lastIndex // 0
r.test(s)
~~~
上面代碼指定從字符串的第五個位置開始搜索,這個位置為空,所以返回`false`。同時,`lastIndex`屬性重置為`0`,所以第二次執行`r.test(s)`會返回`true`。
注意,帶有`g`修飾符時,正則表達式內部會記住上一次的`lastIndex`屬性,這時不應該更換所要匹配的字符串,否則會有一些難以察覺的錯誤。
~~~
var r = /bb/g;
r.test('bb') // true
r.test('-bb-') // false
~~~
上面代碼中,由于正則表達式`r`是從上一次的`lastIndex`位置開始匹配,導致第二次執行`test`方法時出現預期以外的結果。
`lastIndex`屬性只對同一個正則表達式有效,所以下面這樣寫是錯誤的。
~~~
var count = 0;
while (/a/g.test('babaa')) count++;
~~~
上面代碼會導致無限循環,因為`while`循環的每次匹配條件都是一個新的正則表達式,導致`lastIndex`屬性總是等于0。
如果正則模式是一個空字符串,則匹配所有字符串。
~~~
new RegExp('').test('abc')
// true
~~~
- 第一章:變量與作用域
- 第一節:變量
- 第二節:執行環境及作用域
- 第三節:JS 解析機制
- 第四節:垃圾收集
- 第二章:深入函數
- 第一節:概述
- 第二節:函數聲明
- 第三節:函數調用
- 第四節:函數參數
- 第五節:函數返回值
- 第三章:面向對象
- 第一節:概述
- 第二節:對象聲明
- 第三節:this 關鍵字
- 第四節:對象遍歷
- 第五節:對象繼承
- 第六節:模塊
- 第四章:正則表達式
- 第一節:概述
- 第二節:實例屬性
- 第三節:實例方法
- 第一課時:測試
- 第二課時:執行
- 第四節:匹配規則
- 第一課時:字面量字符和元字符
- 第二課時:轉義符
- 第三課時:特殊字符
- 第四課時:字符類
- 第五課時:預定義模式
- 第六課時:重復類
- 第七課時:量詞符
- 第八課時:貪婪模式
- 第九課時:修飾符
- 第十課時:組匹配
- 第五節:字符串的實例方法
- 第一課時:匹配
- 第二課時:搜索
- 第三課時:替換
- 第四課時:分割