ECMAScript 2021 中的正则表达式详解
正则表达式是在前端开发中非常常见的工具,尤其是在字符串匹配、搜索等场景下。ECMAScript 2021 提供了一些新的正则表达式语法和功能,本文将对这些内容进行详细的介绍和讲解。
- 逻辑赋值操作符
||=
和&&=
逻辑赋值操作符 ||=
和 &&=
的作用是先判断左侧操作数是否有值,如果没有则将右侧操作数的值赋给左侧。这样的操作可以用来简化正则表达式的编写。
例如,原本我们需要先定义一个变量用来存储正则表达式,再使用 if
判断是否有值,如果没有再进行赋值操作,如下所示:
let pattern; if (!pattern) { pattern = /hello/g; } console.log(pattern.test('hello world')); // true
有了逻辑赋值操作符 ||=
后,我们可以将以上操作简化为:
let pattern; pattern ||= /hello/g; console.log(pattern.test('hello world')); // true
需要注意的是,逻辑赋值操作符会对左侧操作数进行类型转换,因此在某些情况下可能会产生预期之外的结果。
- 元字符
\p{}
和\P{}
ECMAScript 2021 引入了元字符 \p{}
和 \P{}
,用来匹配 Unicode 字符集合。
\p{}
表示匹配满足条件的 Unicode 字符,而 \P{}
则表示匹配不满足条件的 Unicode 字符。需要注意的是,由于 \p{}
和 \P{}
匹配的是 Unicode 字符,因此需要使用 u
标志开启 Unicode 模式。
例如,我们可以使用 \p{Letter}
来匹配所有的字母字符,如下所示:
const str = 'Hello 你好 abc'; console.log(str.match(/\p{Letter}+/gu)); // ["Hello", "你好", "abc"]
可以使用 \p{Script=}
来指定要匹配的脚本,例如 \p{Script=Han}
可以匹配所有的汉字字符。
- 零宽断言语法
零宽断言语法是指在匹配字符串时,不消耗目标字符串中的字符,从而匹配指定的内容。
在 ECMAScript 2021 中,引入了以下四种零宽断言语法:
(?<=)
:正向先行断言,表示匹配在指定内容之前的字符串。(?<!)
:负向先行断言,表示匹配不在指定内容之前的字符串。(?=)
:正向后行断言,表示匹配在指定内容之后的字符串。(?!)
:负向后行断言,表示匹配不在指定内容之后的字符串。
例如,我们可以使用正向后行断言 (?=)
来匹配所有以 www.
开头的 URL,如下所示:
const str = 'Visit our website at www.example.com'; console.log(str.match(/(?<=www\.)\w+\.\w+/g)); // ["example.com"]
需要注意的是,零宽断言语法只用于匹配,不会返回匹配结果。因此在使用时需要注意其作用位置和使用方式。
- 其他变化
除了以上介绍的语法和功能变化外,ECMAScript 2021 还引入了一些其他变化,包括:
- 具名组捕获的默认值;
- 新的断言语法,包括:
\b
、\B
、\cX
、\K
; - 正则表达式的修饰符变化,包括新的修饰符
ns
和nl
,用于匹配不同类型的行分隔符。
需要注意的是,这些变化的适用范围和具体使用方式会因实际场景的不同而各有区别。因此在使用时需要仔细阅读相关文档和示例代码,以避免出现错误和预期之外的结果。
总结
ECMAScript 2021 中的正则表达式新增了多种语法和功能,包括逻辑赋值操作符、Unicode 字符匹配、零宽断言语法等。这些变化为开发者提供了更加便利和灵活的正则表达式编写方式,同时也提高了应用程序的效率和可靠性。在使用时,应该仔细阅读相关文档和示例代码,以充分了解功能和语法,并确保编写出正确和可靠的正则表达式。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6607b2e8d10417a22264b1c0