无需使用后行断言替换未被反斜杠转义标签的正则方案求助
正则支持转义自定义标签的兼容方案(适配无前后断言环境)
原正则/[^\\]{{\s*PLAYER_NAME\s*}}/gm出现字符截断的核心原因是:[^\\]会匹配一个实际存在的非反斜杠字符,这个字符会被包含在匹配结果中,替换时会随标签一起被替换掉,自然就丢失了标签前的最后一个字符。
解决方案(完全不依赖前后断言,兼容Safari)
- 修改匹配正则,把前缀规则放到捕获组中
将正则调整为:/(^|[^\\]){{\s*PLAYER_NAME\s*}}/gm
这里(^|[^\\])是第一个捕获组,覆盖两种场景:
- 标签位于行首,前面没有任何字符
- 标签前面的字符不是反斜杠,属于需要替换的正常标签
替换时保留捕获组内容
不要直接将匹配结果替换为目标值,而是在目标值前拼接第一个捕获组的内容$1,比如要替换为Richard,替换模板就写为$1Richard,就能把原来标签前的字符原样保留,不会出现截断。额外处理转义标签
所有被转义的\\{{标签前缀,额外加一步替换去掉转义用的反斜杠即可,正则为:/\\{{/g
完整JS示例代码
const rawText = 'Welcome {{ PLAYER_NAME }} to the event, you can use tags in here such as \\{{ PLAYER_NAME }}'; // 第一步替换未转义的目标标签 let result = rawText.replace(/(^|[^\\]){{\s*PLAYER_NAME\s*}}/gm, '$1Richard'); // 第二步移除转义用的反斜杠 result = result.replace(/\\{{/g, '{{'); // 最终输出:Welcome Richard to the event, you can use tags in here such as {{ PLAYER_NAME }}
内容的提问来源于stack exchange,提问作者Richard Bagshaw
相关产品推荐
相关产品推荐

