查找${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中是有效的,因此正则表达式应该返回[${i + "}" }, other matches],但在示例中它返回

${i + "}

如果您可以描述${...}内部的令牌语法,您仍然可以使用regex。

如果我们假设

  • 匹配从${
  • 开始
  • 里面的令牌可以用零或多个空格分隔
  • 令牌由+,-,*/操作符分隔
  • 令牌可以是字符串字符(字母、数字、下划线)或双引号字符串("..."...\...")
  • 匹配以}
  • 结束

你可以使用

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

参见regex演示。

查看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)

最新更新