正则表达式是一种广泛应用于字符串匹配、替换等操作的工具,它可以在很多编程语言中使用,包括 JavaScript。ES9 支持了一些新的正则表达式语法,本文章将介绍如何在 ES9 中使用正则表达式。
RegExp 构造函数的扩展
在 ES9 中,RegExp 构造函数得到了扩展,它现在可以接收第二个参数 flags,和正则字面量的 flags 相同。例:
let regex = new RegExp("foo", "gi");
在这个例子中,创建了一个不区分大小写的全局模式正则表达式,与下面正则字面量的写法等价:
let regex = /foo/gi;
这个语法的优势之一是可以在程序运行时动态生成正则表达式,因为我们可以在标准的字符串中定义正则表达式,稍后再使用 RegExp 构造函数解析该字符串。
RegExp 现在支持后行断言
ES9 引入了后行断言,它们可以用来匹配一个字符串中的某些内容,这些内容在其前面是一个特定模式,同时还在另一些特定模式的后面,后行断言用 (?<=...) 表示,在 ... 的位置插入匹配模式即可。例如:
let regex = /(?<=foo)bar/; console.log("foobar".match(regex)); // 输出 ["bar"]
在这个例子中,后行断言匹配了一个字符串 "bar",它前面必须是 "foo",这个语法还支持使用 (?<!...) 表示“不再这个动作的前面”。
RegExp 现在支持 Unicode 属性转义
Unicode 属性转义是一些特殊的转义序列,它们可以用来匹配特定的 Unicode 属性值。ES9 引入了适用于正则表达式中的 Unicode 属性转义。
在正则表达式中使用 Unicode 属性转义时,必须写成 \p{...} 的形式,例如匹配 Unicode 双字节字符:
let regex = /\p{Unified_Ideograph}/u; console.log("日本語".match(regex)); // 匹配成功
在这个例子中,\p{Unified_Ideograph} 表示一个 Unicode 第一层次表意文字。
一些常见的 Unicode 属性与值
字母和数字
- \p{L}:任意 Unicode 字母字符,等价于 [a-zA-Z]。
- \p{Ll}:任意小写字母字符。
- \p{Lu}:任意大写字母字符。
- \p{Lt}:任意标题字母,如标题的使用,例如英文中的首字母大写,后续字母小写。
- \p{Lm}:任意标记字母,例如阿拉伯语中的命名字符。
- \p{Lo}:其他的任意字母字符集。
标点符号
- \p{P}:字符以及任何类型的标点符号字符。
- \p{Pc}:任何连字符或下划线,如破折号、连字号。
- \p{Pd}:任何类型的连字符,如 iso-8859-1 中中划线的一个副本。
- \p{Ps}:任何类型的起始括号,如小括号。
- \p{Pe}:任何类型的结束括号,如小括号。
- \p{Pi}:任何类型的起始引号,如中文的引号。
- \p{Pf}:任何类型的结束引号,如中文的引号。
- \p{Po}:任何类型的其他标点符号。
示例代码
使用后行断言匹配域名中二级域名,并且在它的前面必须是 www 或 m:
let regex = /(?<=(www|m)\.)\w+\.\w+/; console.log("www.google.com".match(regex)); // 输出 ["google.com"] console.log("m.baidu.com".match(regex)); // 输出 ["baidu.com"]
使用 Unicode 属性转义匹配接连出现的表意文字:
let regex = /\p{Unified_Ideograph}+/u; console.log("日本語".match(regex)); // 输出 ["日本語"] console.log("中华人民共和国".match(regex)); // 输出 ["中华人民共和国"]
总结
ES9 带来了一些新的正则表达式语法,其中后行断言和 Unicode 属性转义是其中最引人注目的特性之一。在实际使用过程中,我们可以灵活应用这些语法,提升代码的可读性和效率。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6532a0ca7d4982a6eb56d866