RegExp是JavaScript中内置的正则表达式对象,用于匹配字符串。在ECMAScript 2018中,此对象新增了一个非常有用的功能:named capture groups,也就是命名捕获组。
传统的正则表达式是基于位置进行匹配的,而named capture groups则允许我们命名一个捕获组,并从中提取所需内容。它使得正则表达式更加语义化、易读和易用。下面,我们来一起学习一下这个新功能。
基础语法
named capture groups的基础语法非常简单。在正则表达式中使用(?<name>...)
来定义一个命名捕获组,其中name
是捕获组的名称,...
是匹配的内容。
比如,我们要匹配一个字符串中的日期,可以使用下面的正则表达式:
------------------------------------------------
这个正则表达式会从一个字符串的开头(^
)匹配四个数字(\d{4}
),作为年份;然后匹配一个短横线(-
),再匹配两个数字(\d{2}
),作为月份;最后再匹配一个短横线(-
)和两个数字(\d{2}
),作为日期。其中,捕获组year
、month
、day
分别捕获年、月、日。
要想从一个字符串中提取日期的各个部分,可以使用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