下面的正则表达式应该找到${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)