You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript正则表达式:忽略转义项匹配未转义自定义分隔符内容

解决未转义${...}的正则匹配问题

我来帮你搞定这个正则需求!你需要匹配未被反斜杠转义的${...}包裹块(包含分隔符),同时忽略转义的\${...},还要正确处理嵌套括号的情况,比如{${only}}里的${only}。

最终正则表达式

/(?<!\\)\$\{(?:[^{}]|(?R))*\}/g

正则各部分解析

  • (?<!\\):负向后瞻断言,确保目标${的前面没有反斜杠,也就是只匹配未被转义的标记
  • \$\{:精确匹配开头的${分隔符(反斜杠转义特殊字符$和{)
  • (?:[^{}]|(?R))*:非捕获组,负责匹配${}内部的内容:
    • [^{}]:匹配任何不是大括号的字符
    • (?R):递归调用整个正则表达式,用来处理嵌套的${...}结构(比如${foo${bar}baz}这种场景,你的示例里外部括号嵌套的${only}也能被正确识别)
  • \}:精确匹配结尾的}分隔符
  • g:全局匹配标志,找出所有符合条件的结果

测试验证

用你的示例字符串测试:

This${ is }a clear${ and simple} example ${string}, where {${only}} only the ${highlighted} parts should be selected.

匹配结果正好是你预期的:
["${ is }", "${ and simple}", "${string}", "${only}"]

为什么你的原有正则不生效?

你之前写的/(\${\s?\S+\s?})/g有两个核心问题:

  1. \S+的局限性:它只能匹配连续的非空白字符,遇到${ and simple}里的空格就会中断,而且无法处理嵌套的括号结构
  2. 未处理转义判断:没有排除前面带反斜杠的\${...},会错误匹配转义后的标记

额外补充(可选)

如果需要支持连续反斜杠的转义场景(比如\\${test},这里第一个反斜杠是转义第二个反斜杠,所以${test}应该被匹配),可以把前瞻断言调整为:

/(?<!(?<!\\)\\)\$\{(?:[^{}]|(?R))*\}/g

这个版本会忽略那些被偶数个反斜杠转义的${,只匹配未转义或奇数个反斜杠(实际是转义了反斜杠本身)的情况。

内容的提问来源于stack exchange,提问作者colxi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:17:28