JS正则表达式中的命名捕获分组

1,932 阅读1分钟

如果看到这么一段代码:

function toLocalDate(date) {
  return date.replace(/(\d{2})-(\d{2})-(\d{4})/, "$2-$1-$3")
}

单看这个函数我们不能够确定这段代码的作用是什么?它是想把“日-月-年”转成“月-日-年”,还是说反过来用。我们不能精确的使用。这个时候就需要用到命名捕获分组了。

function toLocalDate(date){
  return date.replace(/(?<month>\d{2})-(?<day>\d{2})-(?<year>\d{4})/, "$<day>-$<month>-$<year>")
}

命名捕获分组的优点: 1、起到注释的作用,代码清晰; 2、修改了正则表达式,比如说在之前的分组前又添加了一份分组,不需要重新修改第二个参数中的顺序;

使用语法

命名捕获分组自身的语法是 (?<name>...),比普通的分组多了一个 ? 字样,其中 name 的起法就和你平时起变量名一样即可(不过在这里关键字也可用);

反向引用一个命名分组的语法是 \k<name>

命名分组同样可以通过数字索引(\1 \2等表示第几个分组)来反向引用;

比如:

/(?<foo>a)\k<foo>\1/.test("aaa") // true