正则表达式

178 阅读2分钟

新建正则表达式

1. var regex = /xyz/; 以 斜杠 代表开始和结束
2. var redex = new RegExp('xyz'); 利用 RegExp构造函数
上面两种写法是等价的,都新建了一个内容为xyz的正则表达式对象。
它们的主要区别是,
第一种方法在引擎编译代码时,就会新建正则表达式,
第二种方法在运行时新建正则表达式,所以前者的效率较高。
而且,前者比较便利和直观,所以实际应用中,基本上都采用字面量定义正则表达式。

RegExp构造函数还可以接受第二个参数,表示修饰符(详细解释见下文)

var regex = new RegExp('xyz', 'i');
// 等价于
var regex = /xyz/i;

实例属性

正则对象的实例属性分为两类:一类是修饰符相关,表示对应的修饰符是否设置。

RegExp.prototype.ignoreCase:返回一个布尔值,表示是否设置了i修饰符。
RegExp.prototype.global:返回一个布尔值,表示是否设置了g修饰符。
RegExp.prototype.multiline:返回一个布尔值,表示是否设置了m修饰符。
以上三个属性都是只读的
var r = /abc/igm;

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

另一类是与修饰符无关的属性,主要有以下两个:

RegExp.prototype.lastIndex:返回一个数值,表示下一次开始搜索的位置。
该属性可读写,但是只在进行连续搜索时有意义,详细介绍请看后文。
RegExp.prototype.source:返回正则表达式的字符串形式(不包括反斜杠),该属性只读。


var r = /xyz/;
r.lastIndex //0
r.source //"xyz"

实例方法

1.RegExp.prototype.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

如果正则模式是一个空字符串,则匹配所有字符串。

new RegExp('').test('abc')
// true

2.RegExp.prototype.exec()

正则对象的exec方法,用来返回匹配结果。如果发现匹配,就返回一个数组,成员是匹配成功的子字符串,否则返回null;

var s = '_x_x';
var r1 = /x/;
var r2 = /y/;

r1.exec(s) // ["x"]
r2.exec(s) // null