ES6笔记-04 正则的扩展

4 正则的扩展

4.1 RegExp 构造函数

  • 在 ES5 中,RegExp 构造函数的参数为正则表达式时,不允许使用第二个参数添加修饰符。ES6 改变了这种行为——可以使用第二个参数,返回的正则表达式会忽略原有的正则表达式的修饰符。

4.2 字符串的正则方法

  • 字符串对象共有 4 个方法,可以使用正则表达式:match()、replace()、search()和split()。

ES6 将这 4 个方法,在语言内部全部调用RegExp的实例方法,从而做到所有与正则相关的方法,全都定义在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]

4.3 u 修饰符

  • ES6 对正则表达式添加了u修饰符,含义为“Unicode 模式”,用来正确处理大于\uFFFF的 Unicode 字符。也就是说,会正确处理四个字节的 UTF-16 编码。
/^\uD83D/u.test('\uD83D\uDC2A') // false
/^\uD83D/.test('\uD83D\uDC2A') // true

4.4 RegExp.prototype.unicode 属性

  • 正则实例对象新增unicode属性,表示是否设置了u修饰符。
const r1 = /hello/;
const r2 = /hello/u;

r1.unicode // false
r2.unicode // true

4.5 y 修饰符

  • 除了 u 修饰符,ES6 还为正则表达式添加了 y 修饰符,叫做 “粘连” (sticky)修饰符。

y修饰符的作用与g修饰符类似,也是全局匹配,后一次匹配都从上一次匹配成功的下一个位置开始。不同之处在于,g修饰符只要剩余位置中存在匹配就可,而y修饰符确保匹配必须从剩余的第一个位置开始,这也就是“粘连”的涵义。

  • 实际上,y修饰符号隐含了头部匹配的标志^。

4.6 RegExp.prototype.sticky 属性

  • 与y修饰符相匹配,ES6 的正则实例对象多了sticky属性,表示是否设置了y修饰符。

4.7 RegExp.prototype.flags 属性

  • ES6 为正则表达式新增了flags属性,会返回正则表达式的修饰符。
// ES5 的 source 属性
// 返回正则表达式的正文
/abc/ig.source
// "abc"

// ES6 的 flags 属性
// 返回正则表达式的修饰符
/abc/ig.flags
// 'gi'

4.8 s 修饰符:dotAll 模式

  • 正则表达式中,点(.)是一个特殊字符,代表任意的单个字符,但是有两个例外。一个是四个字节的 UTF-16 字符,这个可以用u修饰符解决;另一个是行终止符(line terminator character)。

所谓行终止符,就是该字符表示一行的终结。以下四个字符属于”行终止符“。

– U+000A 换行符(\n)

– U+000D 回车符(\r)

– U+2028 行分隔符(line separator)

– U+2029 段分隔符(paragraph separator)

  • 很多时候我们希望匹配的是任意单个字符,这时有一种变通的写法。
/foo[^]bar/.test('foo\nbar')
// true
  • ES2018 引入s修饰符,使得.可以匹配任意单个字符。
/foo.bar/s.test('foo\nbar') // true

这被称为dotAll模式,即点(dot)代表一切字符。所以,正则表达式还引入了一个dotAll属性,返回一个布尔值,表示该正则表达式是否处在dotAll模式。

4.9 后行断言

http://es6.ruanyifeng.com/#docs/regex#后行断言

4.10 Unicode 属性类

  • ES2018 引入了一种新的类的写法\p{…}和\P{…},允许正则表达式匹配符合 Unicode 某种属性的所有字符。
const regexGreekSymbol = /\p{Script=Greek}/u;
regexGreekSymbol.test('π') // true

上面代码中,\p{Script=Greek}指定匹配一个希腊文字母,所以匹配π成功。

  • Unicode 属性类要指定属性名和属性值。
\p{UnicodePropertyName=UnicodePropertyValue}
  • 对于某些属性,可以只写属性名,或者只写属性值。
\p{UnicodePropertyName}
\p{UnicodePropertyValue}
  • \P{…}是\p{…}的反向匹配,即匹配不满足条件的字符。
  • 注意,这两种类只对 Unicode 有效,所以使用的时候一定要加上u修饰符。如果不加u修饰符,正则表达式使用\p和\P会报错,ECMAScript 预留了这两个类。

4.11 具名组匹配

简介

  • ES2018 引入了具名组匹配(Named Capture Groups),允许为每一个组匹配指定一个名字,既便于阅读代码,又便于引用。
const RE_DATE = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;

const matchObj = RE_DATE.exec('1999-12-31');
const year = matchObj.groups.year; // 1999
const month = matchObj.groups.month; // 12
const day = matchObj.groups.day; // 31

解构赋值和替换

引用

  • 如果要在正则表达式内部引用某个“具名组匹配”,可用使用 \k<组名> 的写法。
  • 数字引用 (\1) 依然有效。

4.12 String.prototype.matchAll