# 4、正则的扩展
# 一、RegExp 构造函数
在 ES5 中正则表达式的创建有两种方式
- 构造函数,new RegExp('xyz','i'); 第一个参数是字符串,第二个参数是修饰符。
- 第二种直接等于表达式的方式/xyz/i
new RegExp('xyz','i') => /xyz/i
在 ES5 中如果构造函数的第一个参数用表达式,第二个参数用修饰符会报错。
在 ES6 中修改了这种情况,不会报错,而且第二个参数会覆盖表达式中的修饰符。
new RegExp(/xyz/gi, "i").flags; // i
上面代码中,原有正则对象的修饰符是ig
,它会被第二个参数i
覆盖。
# 二、字符串的正则方法
字符串对象共有 4 个方法,可以使用正则表达式:match() 、 replace() 、search() 、 和 split()
ES6 中语言内部全部调用 RegExp 的实例方法
String.prototype.match
调用RegExp.prototype[Symbol.match]
String.prototype.replace
调用RegExp.prototype[Symbol.replace]
String.prototype.search
调用RegExp.prototype[Symbol.search]
String.prototype.split
调用RegExp.prototype[Symbol.split]
ES2020 新增 String.prototype.matchAll() 可以一次性取出所有匹配。不过,它返回的是一个遍历器(Iterator),而不是数组。
遍历器的好处是,如果数组很大,遍历器比较节省资源。
遍历器转化成数组也是比较简单的,可以用 for...of 遍历,可以通过Array.from
或者...
运算符转化成数组。
...
ES5 中想要全部匹配需要遍历,不太方便
var str = "美死了!美女";
var reg = /美/g;
reg.test(str); // true
reg.lastIndex; // 1
reg.test(str); // true
reg.lastIndex; // 5
reg.test(str); // false
reg.lastIndex; // 0
ES6 中字符串新增了 matchAll,返回一个 Iterator 的遍历器,很容易可以得到里面的值
var str = '美死了!美女'
var reg = /美/g
const result = str.matchAll(reg)
result // RegExpStringIterator {}
[...result] // [Array(1), Array(1)]
或者
Array.from(result) // [Array(1), Array(1)]
# 三、RegExp 新增属性
- RegExp.prototype.flags 属性, ES6 为正则表达式新增了
flags
属性,会返回正则表达式的修饰符。 - 新增了 y 修饰符(sticky),和 RegExp.prototype.sticky 属性
- 为 exec 新增正则匹配索引