ECMAScript 2018:新增 RegExp named capture groups

RegExp是JavaScript中内置的正则表达式对象,用于匹配字符串。在ECMAScript 2018中,此对象新增了一个非常有用的功能:named capture groups,也就是命名捕获组。

传统的正则表达式是基于位置进行匹配的,而named capture groups则允许我们命名一个捕获组,并从中提取所需内容。它使得正则表达式更加语义化、易读和易用。下面,我们来一起学习一下这个新功能。

基础语法

named capture groups的基础语法非常简单。在正则表达式中使用(?<name>...)来定义一个命名捕获组,其中name是捕获组的名称,...是匹配的内容。

比如,我们要匹配一个字符串中的日期,可以使用下面的正则表达式:

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

这个正则表达式会从一个字符串的开头(^)匹配四个数字(\d{4}),作为年份;然后匹配一个短横线(-),再匹配两个数字(\d{2}),作为月份;最后再匹配一个短横线(-)和两个数字(\d{2}),作为日期。其中,捕获组yearmonthday分别捕获年、月、日。

要想从一个字符串中提取日期的各个部分,可以使用RegExp对象的exec方法,从中获取捕获组的值。

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

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

match.groups中,我们可以直接通过名称来获取捕获组的值,非常直观简洁。

高级用法

named capture groups不仅仅是给捕获组命名那么简单,它还有诸多高级用法,可以让正则表达式更加灵活和强大。

嵌套捕获组

在ECMAScript 2018之前,捕获组是按照左括号的顺序进行编号的,而named capture groups则可以自由地命名捕获组。这使得我们可以非常方便地嵌套捕获组,比如:

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

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

这里用嵌套捕获组的方式来定义一个只匹配单个字符a的正则表达式。在命名捕获组bbb之中放置了字符a,然后命名为aaa。这样,aaa就包含了bbb的匹配结果,也就是a

默认捕获组

在某些情况下,我们需要将正则表达式分组,但是又不需要一个命名捕获组,就可以使用默认捕获组。如果我们使用圆括号而没有命名该捕获组,它将被自动编号为一个不带名称的捕获组。

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

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

非捕获组

有时,我们需要将括号用于分组,但不需要对该组进行捕获,就可以使用非捕获组。用(?:...)语法定义的组是一个非捕获组。

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

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

这里匹配的是一个只有年份的日期字符串。捕获组(\d{4})会匹配年份的四个数字,而(?:\d{2})则会匹配月份但是不会捕获组的内容。

结论

named capture groups是一个非常实用的正则表达式功能,使得JavaScript的匹配和提取字符串更加直观和简洁。我们可以用它来匹配各种格式的字符串,并轻松地提取所需信息。希望通过本文的介绍,大家可以更好地使用JavaScript中的正则表达式。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/67188e8fad1e889fe22c7415