博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ECMAScript正则表达式6个最新特性
阅读量:7305 次
发布时间:2019-06-30

本文共 3170 字,大约阅读时间需要 10 分钟。

hot3.png

译者按: 还没学好ES6?ECMAScript 2018已经到来啦!

  • 原文
  • 作者: : Google V8引擎开发者
  • 译者

为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。

1999年,ECMAScript 3添加了对正则表达式的支持。

16年之后,ECMAScript 6(即ECMAScript 2015或者ES6)引入了, 以及。

这篇博客将介绍ECMAScript正则表达式的最新特性

1. dotAll模式(s选项)

这个特性已经在ECMAScript 2018正式发布了。

默认情况下,.可以匹配任意字符,除了换行符:

/foo.bar/u.test('foo\nbar'); // false

另外,.不能匹配Unicode字符,需要使用u选项启用Unicode模式才行。

ES2018引入了,通过s选项可以启用,这样,.就可以匹配换行符了。

/foo.bar/su.test('foo\nbar'); // true

2. Lookbehind断言

这个特性已经在ECMAScript 2018正式发布了。

ECMAScript目前仅支持lookahead断言。

下面示例是Positive lookahead,匹配字符串“42 dollars”中紧跟着是"dollars"的数字:

const pattern = /\d+(?= dollars)/u;const result = pattern.exec('42 dollars');console.log(result[0]); // 打印42

下面示例是Negative lookahead,匹配字符串“42 pesos”中紧跟着的不是"dollars"的数字:

const pattern = /\d+(?! dollars)/u;const result = pattern.exec('42 pesos');console.log(result[0]); // 打印42

ES2018添加了。

下面示例是Positive lookbehind,匹配字符串“$42”中前面是"$"的数字:

const pattern = /(?<=\$)\d+/u;const result = pattern.exec('$42');console.log(result[0]); // 打印42

下面示例是Negative lookbehind,匹配字符串“$42”中前面不是是"$"的数字:

const pattern = /(?

专注于网页、微信小程序、微信小游戏,支付宝小程序,React Native,Node.js和Java线上BUG实时监控,欢迎免费试用

3. Named capture groups

这个特性已经在ECMAScript 2018正式发布了。

目前,正则表达式中小括号匹配的分组是通过数字编号的:

const pattern = /(\d{4})-(\d{2})-(\d{2})/u;const result = pattern.exec('2017-01-25');console.log(result[0]); // 打印"2017-01-25"console.log(result[1]); // 打印"2017"console.log(result[2]); // 打印"01"console.log(result[3]); // 打印"25"

这样很方便,但是可读性很差,且不易维护。一旦正则表达式中小括号的顺序有变化时,我们就需要更新对应的数字编号。

ES2018添加, 可以指定小括号中匹配内容的名称,这样可以提高代码的可读性,也便于维护。

const pattern = /(?
\d{4})-(?
\d{2})-(?
\d{2})/u;const result = pattern.exec('2017-01-25');console.log(result.groups.year); // 打印"2017"console.log(result.groups.month); // 打印"01"console.log(result.groups.day); // 打印"25"

4. Unicode property escapes

这个特性已经在ECMAScript 2018正式发布了。

Unicode标准为每一个字符分配了多个属性。比如,当你要匹配希腊语字符时,则可以搜索Script_Extensions属性为Greek的字符。

使得我们可以使用ECMAScript正则表达式直接匹配Unicode字符的属性:

const regexGreekSymbol = /\p{Script_Extensions=Greek}/u;console.log(regexGreekSymbol.test('π')); // 打印true

5. String.prototype.matchAll

这个特性还处在Stage 3 Draft

g和y选项通常用于匹配一个字符串,然后遍历所有匹配的子串,包括小括号匹配的分组。让这个操作变得更加简单了。

const string = 'Magic hex numbers: DEADBEEF CAFE 8BADF00D';const regex = /\b[0-9a-fA-F]+\b/g;for (const match of string.matchAll(regex)) {	console.log(match);}

每一个迭代所返回的match对象与regex.exec(string)所返回的结果相同:

// Iteration 1:[	'DEADBEEF',	index: 19,	input: 'Magic hex numbers: DEADBEEF CAFE 8BADF00D']// Iteration 2:[	'CAFE',	index: 28,	input: 'Magic hex numbers: DEADBEEF CAFE 8BADF00D']// Iteration 3:[	'8BADF00D',	index: 33,	input: 'Magic hex numbers: DEADBEEF CAFE 8BADF00D']

注意,这个特性还处在,因此还存在变化的可能性,示例代码是根据最新的提案写的。另外,浏览器也还没有支持这个特性。String.prototype.matchAll最快可以被加入到ECMAScript 2019中。

6. 规范RegExp遗留特性

这个提案还处在Stage 3 Draft

这个提案,比如方法以及它的静态属性从RegExp.$1RegExp.$9。虽然这些特性已经弃用(deprecated)了,但是为了兼容性我们不能将他们去。因此,规范这些RegExp遗留特性是最好的方法。因此,这个提案有助于保证兼容性。

参考

关于Fundebug

专注于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了6亿+错误事件,得到了Google、360、金山软件等众多知名用户的认可。欢迎免费试用!

版权声明: 转载时请注明作者Fundebug以及本文地址:

转载于:https://my.oschina.net/u/3375885/blog/1936300

你可能感兴趣的文章
记一次800多万XML文本文件预处理经历
查看>>
redis3.2装完后 其它机子访问爆protocol error, got 'n' as reply type byte
查看>>
Linux文件系统权限第一弹:文件系统普通权限
查看>>
jQuery操作checkbox选择代码
查看>>
从Facebook手机窥视Facebook发展计划
查看>>
ubuntu时间不对
查看>>
ctags: skipping ***: it is not a regular file.
查看>>
Application中调用getSharedPreferences()出现空指针异常
查看>>
Synchronized关键字
查看>>
演示:思科路由器上DHCP帮助地址的配置
查看>>
We7——很有意思的一个开源CMS
查看>>
多线程
查看>>
webpack使用(一)
查看>>
×××---虚拟专用网服务器
查看>>
解读百度的网站收录和网站清除规则转载
查看>>
详解HttpURLConnection
查看>>
Spring 框架的设计理念与设计模式分析
查看>>
linux查看内存、cpu命令
查看>>
访问网站的流程详解
查看>>
详解Spring MVC 4之DispatcherServlet
查看>>