JavaScript正则命名分组【推荐】

  


  

  

以往我们只是习惯于通过数组下标来访问正则匹配到的分组,但分组达到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/1999

JavaScript正则命名分组【推荐】