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