zl程序教程

您现在的位置是:首页 >  前端

当前栏目

[译] 即将到来的正则表达式新特性

正则表达式 特性 即将 到来
2023-09-27 14:27:54 时间
本文讲的是[译] 即将到来的正则表达式新特性,ES2015 给 JavaScript 语言引入了许多新特性,其中包括正则表达式语法的一些重大改进,新增了 Unicode 编码 (/u) 和粘滞位 (/y)两个修饰符。

ES2015 给 JavaScript 语言引入了许多新特性,其中包括正则表达式语法的一些重大改进,新增了 Unicode 编码 (/u) 和粘滞位 (/y)两个修饰符。而在那之后,发展也并未停止。经过与 TC39(ECMAScript 标准委员会)的其他成员的紧密合作,V8 团队提议并共同设计了让正则表达式更强大的几个新特性。

这些新特性目前已经计划包含在 JavaScript 标准中。虽然提案还没有完全通过,但是它们已经进入 TC39 流程的候选阶段了。我们已经以试验功能(见下文)在浏览器实现了这些特性,以便在最终定稿之前提供及时的设计和实现反馈给各自的提案作者。

本文给您预览一下这个令人兴奋的未来。如果您愿意跟着体验这些即将到来的示例,可以在chrome://flags/#enable-javascript-harmony 页面中开启实验性 JavaScript 功能。

正则表达式可以包含所谓的捕获(或捕获组),它可以捕获一部分匹配的文本。到目前为止,开发者只能通过索引来引用这些捕获,这取决于其在正则匹配中的位置。

const pattern =/(\d{4})-(\d{2})-(\d{2})/u;

const result = pattern.exec(2017-07-10);

// result[0] === 2017-07-10

// result[1] === 2017

// result[2] === 07

// result[3] === 10

但正则表达式已经因难于读、写和维护而臭名昭著,并且数字引用会使事情进一步复杂化。例如,在一个更长的表达式中判断一个独特捕获的索引是很困难的事:

/(?:(.)(.(? =[^(])(.)))/ // 最后一个捕获组的索引是?

更糟糕的是,更改一个表达式可能会潜在地转变所有已存在的捕获的索引:

/(a)(b)(c)\3\2\1/ // 一些简单的有序的反向引用。

/(.)(a)(b)(c)\4\3\2/ // 所有都需要更新。

命名捕获是一个即将到来的特性,它允许开发者给捕获组分配名称来帮助尽可能地解决这些问题。语法类似于 Perl、Java、.Net 和 Ruby:

const pattern =/(? year \d{4})-(? month \d{2})-(? day \d{2})/u;

const result = pattern.exec(2017-07-10);

// result.groups.year === 2017

// result.groups.month === 07

// result.groups.day === 10

命名捕获组也可以被命名的反向引用来引用,并传入 String.prototype.replace:

// 命名反向引用。

/(? LowerCaseX x)y\k LowerCaseX /.test(xyx); //true

// 字符串替换。

const pattern =/(? fst a)(? snd 

ab.replace(pattern,$ snd $ fst ); // ba

ab.replace(pattern,(m, p1, p2, o, s,{fst, snd})= fst + snd); // ba

关于这个新特性的全部详情可以在规范提案中查看。

dotAll 修饰符

默认情况下,元字符 . 在正则表达式中匹配除了换行符以外的任何字符:

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

一个提案引入了 dotAll 模式,通过 /s 修饰符来开启。在 dotAll 模式中,. 也可以匹配换行符。

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

关于这个新特性的全部详情可以在规范提案中查看。

Unicode 属性逃逸(Unicode Property Escapes)

正则表达式语法已经包含了特定字符类的简写。\d 代表数字并且只能是 [0-9];\w 是单词字符的简写,或者写成 [A-Za-z0-9_]。

自从 ES2015 引入了 Unicode,突然间大量的字符可以被认为是数字,例如圈一:①;或者被认为是字符的,例如中文字符:雪。

它们都不会被 \d 或 \w 匹配。而改变这些简写的含义将会破坏已经存在的正则表达式模式。

于是,新的字串类被引入。注意它们只在使用 /u 修饰符的 Unicode-aware 正则表达式中可用。

/\p{Number}/u.test(①); // true

/\p{Alphabetic}/u.test(雪); // true

排除型字符可以使用 \P 匹配。

/\P{Number}/u.test(①); // false

/\P{Alphabetic}/u.test(雪); // false

统一码联盟还定义了许多方式来分类码位,例如数学符号和日语平假名字符:

/^\p{Math}+$/u.test(∛∞∉); // true

/^\p{Script_Extensions=Hiragana}+$/u.test(ひらがな); // true

全部受支持的 Unicode 属性类列表可以在目前的规范提案中找到。更多示例请查看这篇内容丰富的文章

先行断言从一开始就已经是 JavaScript 正则表达式语法的一部分。与之相对的后行断言也终于将被引入。你们中的一些人可能记得,这成为 V8 的一部分已经有一段时间了。我们甚至在底层已经用后行断言实现了 ES2015 规定的 Unicode 修饰符。

“后行断言”这个名字已经很好地描述了它的涵义。它提供一个方式来限制一个正则,只有后行组匹配通过之后才继续匹配。它提供匹配和非匹配两种选择:

/(? =\$)\d+/.exec($1 is worth about ¥123); // [1]

/(? !\$)\d+/.exec($1 is worth about ¥123); //[123]

更多详细信息,查看我们之前的一篇博文,专门介绍了后行断言。相关示例可以查看V8 测试用例

本文的完成有幸得到了很多相关人士的帮助,他们的辛勤工作造就了这一切:特别是语言之王Mathias BynensDan EhrenbergClaude PacheBrian TerlsonThomas Wood、Gorkem Yakin、和正则大师 Erik Corry;还有为语言规范作出努力的每一个人以及 V8 团队对这些特性的实施。

希望您能像我们一样为这些新的正则表达式特性而感到兴奋!

原文发布时间为:2017年7月14日 本文来自云栖社区合作伙伴掘金,了解相关信息可以关注掘金网站。
前端培训-初级阶段(13) - 正则表达式 前端最基础的就是 HTML+CSS+Javascript。掌握了这三门技术就算入门,但也仅仅是入门,现在前端开发的定义已经远远不止这些。前端小课堂(HTML/CSS/JS),本着提升技术水平,打牢基础知识的中心思想,我们开课啦(每周四)。 该文为前端培训-初级阶段(13、18)的补充内容 (介绍了 ECMAScript 历史,ES6 常用点)。 本文介绍ECMAScript基础知识。 前端培训-初级阶段(13) - ECMAScript (语法、变量、值、类型、运算符、语句) 前端培训-初级阶段(13) - ECMAScript (内置对象、函数) 前端培训-初级阶段(13) - 类、模,继承
JavaScript正则表达式的模式匹配教程,并且附带充足的实战代码(二) 我们继续来学习正则表达式吧,没有看过之前文章的小伙伴建议点击上方链接,从第一篇开始看,本系列文章适合从未接触过或不太了解正则表达式的人
JavaScript正则表达式的模式匹配教程,并且附带充足的实战代码(一) 其实我写这篇文章的话,主要是想自己重新复习一遍正则表达式。我们也知道正则表达式在很多语言中都是通用的,所以学好这个好处很多。接下来,就跟我一起来学习一下正则表达式,从0到入门吧。同时我会把文章分成多篇来讲解,欢迎大家持续订阅
JavaScript正则表达式的模式匹配教程,并且附带充足的实战代码(三) 我们继续来学习正则表达式吧,没有看过之前文章的小伙伴建议点击上方链接,从第一篇开始看,本系列文章适合从未接触过或不太了解正则表达式的人
革命性的基于知识编程语言Wolfram发布第一个演示 我们曾在去年年底时介绍过 Stephen Wolfram 这位传奇人物雄心勃勃的新计划,一种将颠覆编程甚至颠覆世界的全新计算模式—Wolfram 语言。2 个月过去之后,这门语言推出了第一个演示视频。虽然视频只有 10 几分钟,但看到那简洁明了的代码以及丰富绚丽的结果之后,你一定会感到极大的震撼。
对中文语法的编程语言的质疑与回应 对常见的对中文语法的编程语言的反对声音进行小结, 并作针对回应. Q&A for creating programming language in Chinese grammar.