如何为指定符号包裹^符号,避免已包裹符号重复嵌套?
符号包裹工具优化:避免重复添加^符号
感谢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
相关产品推荐
相关产品推荐

