在 ES9 (ECMAScript 2018) 中,正则表达式捕获组引入了一个新的语法,即“命名捕获组”,它可以让开发者通过名称来引用捕获的子串,这在某些场景下会非常有用,比如数据校验、字符串解析等等。
什么是命名捕获组
在传统的正则表达式中,常常使用圆括号 ()
来将一部分模式进行捕获,然后再通过编号来引用这个捕获的子串。例如:
const str = 'Hello, World!'; const pattern = /(\w+)\s*,\s*(\w+)/; const match = pattern.exec(str); console.log(match[1]); // "Hello" console.log(match[2]); // "World"
上述代码中,(\w+)
和 (\w+)
就是捕获组,分别对应上述正则表达式的第一个和第二个子表达式,通过索引可以得到它们捕获的子串。
而在命名捕获组中,我们可以使用语法 (?'name'pattern)
来给捕获组命名,其中 name
就是给这个捕获组起的名字,而 pattern
则是与这个捕获组匹配的正则表达式。例如:
const str = 'Hello, World!'; const pattern = /(?<greeting>\w+)\s*,\s*(?<name>\w+)/; const match = pattern.exec(str); console.log(match.groups.greeting); // "Hello" console.log(match.groups.name); // "World"
上述代码中,(?<greeting>\w+)
和 (?<name>\w+)
就是命名捕获组,分别对应捕获 Hello
和 World
这两个子串,通过 .groups
属性可以访问到它们。
值得注意的是,正则表达式的“命名捕获组”语法是以 (?<name>
开头的,其中 name
可以随意替换成任何有效的标识符,但需要注意不要和其他模式匹配。比如 (?'name'
、(?<name=>"hello"
等都是无效的语法。
如何使用命名捕获组
在实际开发中,命名捕获组常常用于数据校验、字符串解析等场景。例如,假设我们需要解析一个 URL,获取其中的协议、域名、路径等信息,我们可以使用正则表达式来实现:
-- -------------------- ---- ------- ----- ---------- - ----------------------------------------------------------------------------- -------- ------------- - ----- ----- - --------------------- -- -------- - ----- --- -------------- ------ - ------ - --------- ---------------------- ----- ------------------ ----- ----------------- -- --- ----- ----------------- -- ---- -- - --------------------------------------------------------------------------- ------------------------------------------------------------ ---------------------------------------------------------------
在上述代码中,我们定义了一个正则表达式 urlPattern
,它包含了四个命名捕获组 protocol
、host
、port
和 path
,然后使用 exec
方法来匹配字符串并获取捕获的内容。最后,我们根据捕获的结果,生成一个包含协议、域名、端口、路径等信息的对象返回。
通过这个例子,我们可以发现命名捕获组在字符串解析、数据校验等场景中非常有用,它可以提升代码的可读性、可维护性和复用性。
示例代码
下面是一些使用命名捕获组的示例代码,供读者参考学习。
示例 1:校验邮箱地址格式
-- -------------------- ---- ------- ----- ------------ - ------------------------------------------------------------------ -------- -------------------- - ----- ----- - ------------------------- -- -------- - ----- --- -------------- ----- ---------- - ------ - --------- ---------------------- ------- -------------------- ---------- ----------------------- -- - -------------------------------------------------- --------------------------------------------------------- --------------------------------------------
示例 2:提取 Markdown 标题
-- -------------------- ---- ------- ----- --------- - --------------------------------------------------- -------- ----------------- - ----- ------ - --- --- ------ ----- ------- - -------------------- - ------------- ------ -------------------------- ------ ------------------- --- - ------ ------- - ---------------------------- ----------- ------------ ------------
示例 3:格式化时间字符串
-- -------------------- ---- ------- ----- ---------------- - ----------------------------------------------- ------------------------------------------------------------ -------- --------------------- - ----- ----- - --------------------------------- -- -------- - ----- --- -------------- --------- --------- - ----- - ----- ------ ---- ----- ------- ------ - - ------------- ------ ------------------------ -------------------------- -- ------- - ------------------------------------------------ ---------------------------------- ---------
总结
本文介绍了 ES9 中的正则表达式命名捕获组语法,包括命名捕获组的基本语法、使用方法和示例代码。命名捕获组可以提升代码的可读性、可维护性和复用性,特别适用于字符串解析、数据校验等场景。希望读者通过本文的介绍和示例代码,掌握命名捕获组的使用方法,并在实际开发中灵活应用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/646450a3968c7c53b0531c6e