在 ES12(ES2021)中,RegExp 对象中引入了一些新的属性。这些属性使得正则表达式更加强大和灵活。本文将介绍这些新属性以及它们的使用。
具名捕获组
在早期的 JavaScript 版本中,捕获组只能通过位置来获取匹配的内容。例如,使用 /(\w+) (\w+)/
匹配字符串 "Hello World"
,可以使用 $1
和 $2
来获取匹配的值。但是,如果我们想要获取特定名称的值,现在在 ES12 中可以采用“具名捕获组”。
具名捕获组的语法为 (?<name>pattern)
,其中 name
是命名捕获组的名称,pattern
是捕获组的正则表达式。下面是一个示例:
const text = 'John Smith'; const regex = /(?<first>\w+) (?<last>\w+)/; const match = regex.exec(text); console.log(match.groups.first); // 'John' console.log(match.groups.last); // 'Smith'
在上面的代码中,我们使用 (?<first>\w+)
和 (?<last>\w+)
分别代表两个不同的具名捕获组。我们可以通过 match.groups
对象来获取每个具名捕获组的值。
s 修饰符
在 JavaScript 中,.
匹配除了换行符外的任何字符。但是,这在处理多行文本时可能会导致问题。在 ES12 中,新增了一个 s
修饰符,使得 .
可以匹配任何字符,包括换行符。
下面是一个示例:
const text = 'foo\nbar'; const regex1 = /foo.bar/; console.log(regex1.test(text)); // false,由于 . 无法匹配换行符 const regex2 = /foo.bar/s; console.log(regex2.test(text)); // true
y 修饰符
在早期的 JavaScript 版本中,我们可以使用 g
修饰符来进行全局匹配。但是,由于在全局匹配下,正则表达式的位置信息会被覆盖,所以无法使用 .lastIndex
属性来获取下一个匹配的位置。在 ES12 中,新增了一个 y
修饰符,使得我们可以进行“粘性”匹配,即匹配不会跨越两个不同的位置。
下面是一个示例:
-- -------------------- ---- ------- ----- ---- - --------- ----- ------ - ------- ------------------------------- -- ---- ------------------------------ -- ---------- - ----- ------ - ------- ------------------------------- -- ---- ------------------------------ -- ---------- - ---------------- - -- ------------------------------- -- ---------------- - -
在上面的代码中,我们使用 /abc/g
和 /abc/y
分别进行全局匹配和粘性匹配。可以看到,使用 /abc/y
时,lastIndex
属性的值始终保持不变。
Unicode 属性转义
在 ES12 中,新增了一些 Unicode 属性转义,使得我们可以更方便地定义正则表达式。PropertyName=value
语法用来表示的就是 Unicode 属性,其中 PropertyName
是属性的名字,value
是属性的值。
下面是一些常见的 Unicode 属性转义:
\p{PropertyName}
匹配具有指定属性的字符\P{PropertyName}
不匹配具有指定属性的字符\p{Script}
匹配指定脚本的字符\p{Emoji}
匹配符合 Unicode 表情符号的字符
下面是一个示例:
const text = '😀😁😂'; const regex = /\p{Emoji}/gu; console.log(regex.test(text)); // true
在上面的代码中,我们使用 /\p{Emoji}/gu
来匹配字符串中的表情符号。
结论
在 ES12 中,RegExp 对象中新增了一些属性,使得正则表达式更加强大和灵活。其中具名捕获组和 Unicode 属性转义使得正则表达式的可读性和可维护性得到了提升,而 s
和 y
修饰符使得正则表达式的功能更加强大。希望本文对你的学习和开发有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6752abc68bd460d3ad972a42