资讯专栏INFORMATION COLUMN

ECMAScript正则表达式6个最新特性

kumfo / 3296人阅读

摘要:年,添加了对正则表达式的支持。这篇博客将介绍正则表达式的最新特性模式选项断言规范遗留特性模式选项这个特性已经在正式发布了。参考阮一峰入门博客正则表达式进阶指南关于专注于微信小程序微信小游戏支付宝小程序和实时监控。

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

原文:ECMAScript regular expressions are getting better!

作者: Mathias Bynens: Google V8引擎开发者

译者:Fundebug

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

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

16年之后,ECMAScript 6(即ECMAScript 2015或者ES6)引入了Unicode模式(u选项), sticky模式(y选项)以及RegExp.prototype.flags的getter方法。

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

dotAll模式(s选项)

Lookbehind断言

Named capture groups

Unicode property escapes

String.prototype.matchAll

规范RegExp遗留特性

1. dotAll模式(s选项)
这个特性已经在ECMAScript 2018正式发布了。

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

/foo.bar/u.test("foo
bar"); // false

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

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

/foo.bar/su.test("foo
bar"); // 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添加了lookbehind断言。

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

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

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

const pattern = /(?

Fundebug专注于网页、微信小程序、微信小游戏,支付宝小程序,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添加named capture groups, 可以指定小括号中匹配内容的名称,这样可以提高代码的可读性,也便于维护。

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的字符。

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

const regexGreekSymbol = /p{Script_Extensions=Greek}/u;
console.log(regexGreekSymbol.test("π")); // 打印true
5. String.prototype.matchAll
这个特性还处在Stage 3 Draft

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

const string = "Magic hex numbers: DEADBEEF CAFE 8BADF00D";
const regex = /[0-9a-fA-F]+/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"
]

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

6. 规范RegExp遗留特性
这个提案还处在Stage 3 Draft

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

参考

阮一峰 - ECMAScript 6 入门

Fundebug博客 - JavaScript正则表达式进阶指南

ECMAScript 2018: the final feature set

关于Fundebug

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

版权声明

转载时请注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2018/08/30/ecmascript-regular-expression-new-features/

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/97172.html

相关文章

  • 【译】ECMAScript文档---序言及1-6章(上)

    摘要:随后,它出现在公司之后的浏览器,以及从微软从起发布的所有浏览器上。标准的第版在年月的大会上被表决接受。第版在年月底大会上被采纳。 前言   本系列译文的初衷旨在希望更多人能够了解关于JS的一些基本概念,遇到原理性的问题时多去翻翻文档,而不是在社区无休止的重复提出某些在文档中能够非常方便快捷就能找到的东西。   精力和水平有限,所以暂时只打算尝试翻译前面几章概括性的介绍,同时后面的章节大...

    wind3110991 评论0 收藏0
  • ECMAScript 5.1 实用特性概览

    摘要:返回一个由原数组中的每个元素调用一个指定方法后的返回值组成的新数组。方法测试数组中的某些元素是否通过了指定函数的测试,返回值非常实用的功能,判断数组中是否某元素符合特定条件。 ECMAScript 5发布于2009年12月。ECMAscript 5.1版(下文称ES5)发布于2011年6月,,并且成为ISO国际标准(ISO/IEC 16262:2011) http://www.ecma...

    xiao7cn 评论0 收藏0
  • ECMAScript 5.1 实用特性概览

    摘要:返回一个由原数组中的每个元素调用一个指定方法后的返回值组成的新数组。方法测试数组中的某些元素是否通过了指定函数的测试,返回值非常实用的功能,判断数组中是否某元素符合特定条件。 ECMAScript 5发布于2009年12月。ECMAscript 5.1版(下文称ES5)发布于2011年6月,,并且成为ISO国际标准(ISO/IEC 16262:2011) http://www.ecma...

    bang590 评论0 收藏0
  • ECMAScript6特性——“正则的扩展”

    摘要:第二个参数指定修饰符,如果存在则使用指定的修饰符。属性表示是否设置了修饰符属性的属性返回正则表达式的正文的属性返回正则表达式的修饰符字符串必须转义,才能作为正则模式。 1 RegExp构造函数 ES6 允许RegExp构造函数接受正则表达式作为参数。第二个参数指定修饰符,如果存在则使用指定的修饰符。 var regexp = new RegExp(/xyz/i, ig); consol...

    Shisui 评论0 收藏0
  • 细解JavaScript ES7 ES8 ES9 新特性

    摘要:定期召开会议,会议由会员公司的代表与特邀专家出席。新版本将会包含每年截止时间之前完成的所有特性。它引入了一个新的构造函数和具有辅助函数的命名空间对象。 导言:ECMAScript的演化不会停止,但是我们完全没必要害怕。除了ES6这个史无前例的版本带来了海量的信息和知识点以外,之后每年一发的版本都仅仅带有少量的增量更新,一年更新的东西花半个小时就能搞懂了,完全没必要畏惧。本文将带您花大约...

    Youngs 评论0 收藏0

发表评论

0条评论

kumfo

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<