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

如何为指定符号包裹^符号,避免已包裹符号重复嵌套?

符号包裹工具优化:避免重复添加^符号

感谢Konrad提供的JavaScript代码,可将指定数组中的符号用^包裹,原代码示例如下:

const signs = [',', '!!', '?!', '!?', '...', '..', '.', '?', '؟!', '!؟', '!', '؟', ':'];

const input = 'this is, a text?'

const str = signs.map(e => e.replace(/\?/g, '\\?').replace(/\./g, '\\.')).join('|')

const regex = new RegExp(` ?(${str}) ?`, 'g')

const result = input.replace(regex, ' ^$1^ ').trim()

console.log(result)

存在问题

当输入字符串为this is ^,^ a text ^?^ ?时,现有代码会重复添加^符号,得到错误结果:
this is ^ ^,^ ^ a text ^ ^?^ ^ ^?^
期望正确结果:
this is ^,^ a text ^?^ ^?^

解决方案

核心思路是跳过已经被包裹的符号,通过正则的负向断言实现,确保匹配的符号前后没有。

修改后的代码如下:

const signs = [',', '!!', '?!', '!?', '...', '..', '.', '?', '؟!', '!؟', '!', '؟', ':'];

const input = 'this is ^,^ a text ^?^ ?'

// 转义正则特殊字符
const escapedSigns = signs.map(sign => 
  sign.replace(/[.?]/g, char => `\\${char}`)
);

// 构建正则:匹配未被^包裹的符号,前后允许有空格
const regex = new RegExp(`(?:^|(?<!\\^)) ?(${escapedSigns.join('|')}) ?(?!\\^)`, 'g');

const result = input.replace(regex, ' ^$1^ ').trim();

console.log(result); // 输出:this is ^,^ a text ^?^ ^?^

代码说明

  • 负向断言:(?<!\\^) 确保符号前没有^,(?!\\^) 确保符号后没有^,彻底避免重复包裹已处理的符号
  • 边界兼容:(?:^|(?<!\\^)) 处理字符串开头的场景,保证开头的符号也能正常匹配
  • 空格处理:保留原逻辑中的空格匹配逻辑,同时不会干扰已被包裹的符号

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 12:00:58