以往我们只是习惯于通过数组下标来访问正则匹配到的分组,但分组达到4、5个时,标识起来就会非常麻烦.V8早已实现了正则命名分组提案,只是我们很少使用,本文将介绍JS的正则命名分组。
假设要使用正则匹配一个日期的年月日,以往我们会这样做:
const RE_DATE=/(\ d {4}) - (\ d {2})/(\ d {2}); const matchObj=RE_DATE.exec (' 1999-12-31 '); const年=matchObj [1];//1999 const月=matchObj [2];//12 const天=matchObj [3];//31日
-
<李>要找到一个分组的位置,你必须要去数括号的位置,有时嵌套起来会更令人头疼。李>
<李>后面维护代码的同学阅读起来,还要根据下标找到正则里面对应的括号,并且要再次阅读括号里面的正则才知道含义。李>
<李>当你调整正则捕获分组的数量,顺序或嵌套时,你必要还要对下面的代码做调整。
李>
所有这些问题,都可以通过正则命名分组来解决。
现在你只需要给分组里面一个命名标识即可:
<代码> (& # 63;& lt; year> \ d{4}) 代码>
这里,我们用变量年标记了上一个捕获组# 1。该名称必须是合法的JavaScript标识符。匹配后,您可以通过matchObj.groups.year访问捕获的字符串。
让我们通过命名分组重写前面的代码:
const RE_DATE=/(& # 63; & lt; year> \ d {4})——(& # 63; & lt; month> \ d {2})——(& # 63; & lt; day> \ d {2})/; const matchObj=RE_DATE.exec (' 1999-12-31 '); const年=matchObj.groups.year;//1999 const月=matchObj.groups.month;//12 const天=matchObj.groups.day;//31日
如果正则里面有了命名分组,那么匹配结果会多了一个群体的属性,这个属性中包含了一切命名分组的捕获结果。配合上解构大法使用又是一股清流:
const{组:{一天,年}}=RE_DATE.exec (' 1999-12-31 '); console.log(年);//1999 console.log(天);//31日
当然,即使你使用了命名分组,那么返回的结果还可以通过以往的数组下标方式访问:
const year2=matchObj [1];//1999 const month3=matchObj [2];//12 const day2=matchObj [3];//31日
-
<李>找到分组的“ID”更容易。李>
<李>匹配的代码变得自描述性,因为分组的ID描述了捕获的内容。李>
<李>如果更改分组的顺序,则不必更改匹配的代码。李>
<李>分组的名称也使正则表达式更易于理解,因为您可以直接看到每个组的用途。
李>
反向引用命名分组\ k
看下面这个匹配重复单词的例子:
const RE_TWICE=/^ & # 63; & lt; word> [a - z] +) ! \ k$/; RE_TWICE.test(“校正!”);//正确的 RE_TWICE.test (abc ! ab);//错误
同时也可以使用以往的反向引用方式:
const RE_TWICE=/^ & # 63; & lt; word> [a - z] +) ! \ 1 $/; RE_TWICE.test(“校正!”);//正确的 RE_TWICE.test (abc ! ab);//错误
字符串方法取代()以两种方式支持命名分组:
<强>方式一强>
const RE_DATE=/(& # 63; & lt; year> \ d {4})——(& # 63; & lt; month> \ d {2})——(& # 63; & lt; day> \ d {2})/; console.log (' 1999-12-31 ' .replace (RE_DATE $ & lt; month>/$ & lt; day>/$ & lt; year>”);//12/31/1999
如果取代不一定是直接返回新的拼接字符串,那么可以看看下面的办法:
<强>方式二强>
const RE_DATE=/(& # 63; & lt; year> \ d {4})——(& # 63; & lt; month> \ d {2})——(& # 63; & lt; day> \ d {2})/; console.log (' 1999-12-31 ' .replace ( RE_DATE, (g, y, m, d,抵消,输入,{年、月、日})=比; 月+ '/' + +‘/?年));//12/31/1999
看看这替换的调形参密密麻麻看得心慌慌,很多都用不上,那么我们看看更简单的写法:
console.log (' 1999-12-31 ' .replace (RE_DATE (…args)=比;{ const{年、月、日}=args.slice (1) [0]; 返回月+‘/?天+ '/' +; }));//12/31/1999JavaScript正则命名分组【推荐】