查找 ${any expression} 的所有匹配项的正则表达式

Regular expression that finds all matches of ${any expression}

下面的正则表达式应该找到${any expression}的所有匹配项,代码如下:

const reg= /$\{[^]+\}/g
let txt= '`${i + " test"} RESULT ${2 + 4} now ${i} hi`'
let result= [...txt.matchAll(reg)];
console.log(result)

正如您所注意到的,结果是它几乎提取了整个字符串,正确的操作应该在控制台中打印一个包含 3 个元素的数组,其中包含 ${any expression}

下面的例子显示了如果我使用时产生的错误:[^}]

const reg= /$\{[^}]+\}/g
let i= "some"
let txt= `${i + " test"} RESULT ${2 + 4} now ${i + "}" } hi`
let txtString= '`${i + " test"} RESULT ${2 + 4} now ${i + "}" } hi`'
let result= [...txtString.matchAll(reg)];
console.log(result)
console.log(txt)

表达式 ${i + "}" } 在 JavaScript 中有效,因此正则表达式应该 return [${i + "}" }, other matches] 但在示例中 returns

${i + "}

如果您可以在 ${...} 中描述令牌语法,您仍然可以使用正则表达式。

如果我们假设

  • 比赛开始于${
  • 里面的标记可以用零个或多个空格分隔
  • 令牌被分隔 +-*/ 运算符
  • 标记可以是单词字符的字符串(字母、数字、下划线)或双引号字符串文字 ("...\"...\...")
  • 比赛以}
  • 结束

然后您可以使用

const reg= /${\s*(?:\w+|"[^"\]*(?:\[^][^"\]*)*")(?:\s*[-+\/*]\s*(?:\w+|"[^"\]*(?:\[^][^"\]*)*"))*\s*}/g

参见regex demo

查看 JavaScript 演示:

const token = '(?:\w+|"[^"\\]*(?:\\[^][^"\\]*)*")';
const op = '[-+/*]';
const reg= new RegExp(String.raw`${\s*${token}(?:\s*${op}\s*${token})*\s*}`, 'g');
let i= "some"
let txt= `${i + " test"} RESULT ${2 + 4} now ${i + "}" } hi`
let txtString= '`${i + " test"} RESULT ${2 + 4} now ${i + "}" } hi`'
let result= [...txtString.matchAll(reg)];
console.log(result)
console.log(txt)