La siguiente expresión regular debe encontrar todas las coincidencias de ${any expression} , el código es el siguiente:
const reg= /\$\{[^]+\}/g let txt= '`${i + " test"} RESULT ${2 + 4} now ${i} hi`' let result= [...txt.matchAll(reg)]; console.log(result) Como notarás, el resultado es que extrae casi toda la cadena, la operación correcta debería imprimir en la consola un arreglo de 3 elementos que contendría la ${any expression}
El siguiente caso muestra un error que se genera si uso: [^}]
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) la expresión ${i + "}" } es válida en JavaScript, por lo que la expresión regular debería devolver [${i + "}" }, other matches] pero en el ejemplo que se muestra devuelve
${i + "}Si puede describir la sintaxis del token dentro ${...} , también puede usar una expresión regular.
Si asumimos que
${+ , - , * o /"...\"...\\..." )}A continuación, puede utilizar
const reg= /\${\s*(?:\w+|"[^"\\]*(?:\\[^][^"\\]*)*")(?:\s*[-+\/*]\s*(?:\w+|"[^"\\]*(?:\\[^][^"\\]*)*"))*\s*}/gVea la demostración de expresiones regulares .
Vea la demostración de 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)