正则实例对象的`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 关键字
- 第四节:对象遍历
- 第五节:对象继承
- 第六节:模块
- 第四章:正则表达式
- 第一节:概述
- 第二节:实例属性
- 第三节:实例方法
- 第一课时:测试
- 第二课时:执行
- 第四节:匹配规则
- 第一课时:字面量字符和元字符
- 第二课时:转义符
- 第三课时:特殊字符
- 第四课时:字符类
- 第五课时:预定义模式
- 第六课时:重复类
- 第七课时:量词符
- 第八课时:贪婪模式
- 第九课时:修饰符
- 第十课时:组匹配
- 第五节:字符串的实例方法
- 第一课时:匹配
- 第二课时:搜索
- 第三课时:替换
- 第四课时:分割