regex 具有动态名称的正则表达式命名捕获组

izj3ouym  于 2023-01-27  发布在  其他
关注(0)|答案(1)|浏览(93)

我有一串用逗号分隔的键-值对,但为了简单起见,假设我只有一个键-值对:foo=bar.
是否有一种方法可以创建命名组,其中名称将由=符号之前的内容和=符号之后的值确定?名为foo的常规捕获组如下所示:

.*?=(?<foo>.*)

我尝试过用另一个组捕获密钥,然后通过引用该组来替换<foo>,但在命名组中,<>之间只允许字母数字字符:

(?P<key>.*?)=(?<(?P=key)>.*)
nx7onnlm

nx7onnlm1#

虽然这个问题是4年前的问题,没有答案,谷歌已经建议它在顶部给我,所以我会张贴自己的解决方案。最初的海报没有特别的编程语言的想法,这是如何可以在JavaScript中完成:

const path = '/one/:two/three/:four/five/six/:seven';
const params = [...path.matchAll(/:(\w+)/g)];
const paramNames = params.map(function paramName(param) {
  return param[1];
});
let regexPath = path;
for (const paramName of paramNames) {
  // /:foo/ ---> /(?<foo>\\w+)/
  regexPath = regexPath.replace(new RegExp(`:${paramName}`), `(?<${paramName}>\\w+)`);
}
console.log({ regexPath });
// prints: {regexPath: "/one/(?<two>\\w+)/three/(?<four>\\w+)/five/six/(?<seven>\\w+)"}
// Now it's ready to be passed to a RegExp constructor (Notice how backslashes have been escaped, this is needed when keeping regex as a string).

相关问题