详解 ES9 中新增的正则表达式具名捕获

阅读时长 4 分钟读完

在 ES9 中,正则表达式新增了一项功能:正则表达式具名捕获。这项功能可以让我们在正则匹配过程中,对匹配到的不同部分进行更精细的管理,从而更加高效地使用正则表达式。

什么是正则表达式具名捕获

在传统的正则表达式中,我们使用无序的位置捕获来获取字符串中的某些部分。例如,我们可以使用括号 () 来捕获一个子字符串,将其放到一个数组中返回。但是,在这种方式下,我们只能使用索引来访问要获取的不同部分,这样就不够直观且不易编码。

正则表达式具名捕获就是为了解决这个问题而产生的。它允许我们在正则表达式模式中为不同部分添加名称,而不是只依赖索引,便于开发和代码维护。

例如,考虑以下正则表达式:

这里使用了位置捕获,即使用括号捕获了三个部分,分别是年、月和日。但是获取这些部分就需要用到这个数组的索引,这不够直观。如果使用了具名捕获,代码将更容易阅读和理解:

在这个正则表达式中,使用了 (?<name>pattern) 的语法来定义一个具名捕获组。每个具名捕获组都有一个名称,例如这里的 yearmonthday。接下来,在执行 exec(...) 方法之后,我们可以通过 result.groups 来获取这三个部分。

具名捕获的优点

上面的例子中已经展示了具名捕获的好处:更加清晰和易于维护的代码。

另外,在传统的正则表达式中,如果一个模式有多个捕获组,且其中一个捕获组没有匹配到,那么这个捕获组在返回的数组中就是 undefined。而在具名捕获中,每个捕获组都会有一个名称,因此不会有这种情况发生。这使得我们能够更加安全地编写正则表达式。

具名捕获也提供了更方便的访问方式。如果使用了索引捕获,我们需要了解每个捕获组的位置。但是,在具名捕获中,我们可以用名称直接访问需要的部分,这样便于代码的编写和维护。

具名捕获的用法示例

下面是一个使用具名捕获的示例,该示例演示了如何从一个 URI 字符串中提取出其各个部分:

-- -------------------- ---- -------
----- ------- - ---------------------------------------------
----- --- - ----------------------------------------------------
----- ------ - ------------------

---------------------------
-- -
--   ------- ------------------
--   ----- ---------------------------
-- -

在这个示例中,我们使用具名捕获来提取出协议、域名和路径的各个部分。这些部分都有一个名称,便于我们理解。同时,我们使用了非贪婪的通配符 .* 来定义捕获组,以避免在匹配时“吃掉”后面的查询字符串。

具名捕获名称的规则

在使用具名捕获时,捕获组名称必须符合标识符命名规则。

具体来说,捕获组名称应该满足以下要求:

  • 名称只能包含字母、数字、下划线和美元符号($)。
  • 名称不能以数字开头。

结论

在 ES9 中,新增了正则表达式具名捕获的功能。具名捕获组允许我们为匹配到的不同部分添加名称,方便我们更好地理解和处理代码。同时,使用名称访问一段文本比使用索引更易于理解和维护。

如果想要更好地使用正则表达式,具名捕获是一个不错的选择。当然,必须考虑到需要使用兼容 ES9 或更高版本的浏览器和运行时才能使用。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66f123156fbf96019736bedc

纠错
反馈