在 ES9 中,正则表达式新增了一项功能:正则表达式具名捕获。这项功能可以让我们在正则匹配过程中,对匹配到的不同部分进行更精细的管理,从而更加高效地使用正则表达式。
什么是正则表达式具名捕获
在传统的正则表达式中,我们使用无序的位置捕获来获取字符串中的某些部分。例如,我们可以使用括号 ()
来捕获一个子字符串,将其放到一个数组中返回。但是,在这种方式下,我们只能使用索引来访问要获取的不同部分,这样就不够直观且不易编码。
正则表达式具名捕获就是为了解决这个问题而产生的。它允许我们在正则表达式模式中为不同部分添加名称,而不是只依赖索引,便于开发和代码维护。
例如,考虑以下正则表达式:
const pattern = /(\d{4})-(\d{2})-(\d{2})/; const result = pattern.exec('2022-03-01'); console.log(result); // ["2022-03-01", "2022", "03", "01", index: 0, input: "2022-03-01"]
这里使用了位置捕获,即使用括号捕获了三个部分,分别是年、月和日。但是获取这些部分就需要用到这个数组的索引,这不够直观。如果使用了具名捕获,代码将更容易阅读和理解:
const pattern = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/; const result = pattern.exec('2022-03-01'); console.log(result.groups); // {year: "2022", month: "03", day: "01"}
在这个正则表达式中,使用了 (?<name>pattern)
的语法来定义一个具名捕获组。每个具名捕获组都有一个名称,例如这里的 year
、month
和 day
。接下来,在执行 exec(...)
方法之后,我们可以通过 result.groups
来获取这三个部分。
具名捕获的优点
上面的例子中已经展示了具名捕获的好处:更加清晰和易于维护的代码。
另外,在传统的正则表达式中,如果一个模式有多个捕获组,且其中一个捕获组没有匹配到,那么这个捕获组在返回的数组中就是 undefined
。而在具名捕获中,每个捕获组都会有一个名称,因此不会有这种情况发生。这使得我们能够更加安全地编写正则表达式。
具名捕获也提供了更方便的访问方式。如果使用了索引捕获,我们需要了解每个捕获组的位置。但是,在具名捕获中,我们可以用名称直接访问需要的部分,这样便于代码的编写和维护。
具名捕获的用法示例
下面是一个使用具名捕获的示例,该示例演示了如何从一个 URI 字符串中提取出其各个部分:
-- -------------------- ---- ------- ----- ------- - --------------------------------------------- ----- --- - ---------------------------------------------------- ----- ------ - ------------------ --------------------------- -- - -- ------- ------------------ -- ----- --------------------------- -- -
在这个示例中,我们使用具名捕获来提取出协议、域名和路径的各个部分。这些部分都有一个名称,便于我们理解。同时,我们使用了非贪婪的通配符 .*
来定义捕获组,以避免在匹配时“吃掉”后面的查询字符串。
具名捕获名称的规则
在使用具名捕获时,捕获组名称必须符合标识符命名规则。
具体来说,捕获组名称应该满足以下要求:
- 名称只能包含字母、数字、下划线和美元符号($)。
- 名称不能以数字开头。
结论
在 ES9 中,新增了正则表达式具名捕获的功能。具名捕获组允许我们为匹配到的不同部分添加名称,方便我们更好地理解和处理代码。同时,使用名称访问一段文本比使用索引更易于理解和维护。
如果想要更好地使用正则表达式,具名捕获是一个不错的选择。当然,必须考虑到需要使用兼容 ES9 或更高版本的浏览器和运行时才能使用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66f123156fbf96019736bedc