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

正则表达式边界添加例外:解决Emoji被误删除的问题

解决Emoji被误删除的正则调整方案

你的问题核心在于两个点:一是原正则缺少Unicode模式标志(u),导致无法正确识别Emoji这类多字节Unicode字符;二是\b单词边界会把你指定的Emoji当作非单词字符,从而在分割时把它们和正文分开,最终导致误删。

下面是具体的修复方案:

步骤1:理解问题根源

原代码的正则/.{1,21}\b/g有两个关键缺陷:

  • 没有u标志:JavaScript中默认正则会把Emoji(比如😊)拆成两个UTF-16代码单元处理,.{1,21}的字符计数会出错,\b也无法正确识别Unicode字符的边界。
  • \b的局限性:单词边界\b只把字母、数字、下划线视为“单词字符”,你指定的Emoji会被归类为非单词字符,导致分割时在Emoji和正文之间断开,Emoji可能被孤立成短块甚至丢失。

步骤2:自定义边界规则

我们需要把你列出的Emoji纳入“单词字符”的范畴,让正则不会在这些Emoji和其他正文之间触发分割。首先把目标Emoji转换成Unicode码点构造字符集,再自定义单词边界逻辑。

完整实现代码

// 定义需要保护的特定Emoji的Unicode字符集
const protectedEmojis = /[\u{1F60A}\u{1F60B}\u{1F60E}\u{1F60D}\u{1F618}\u{1F617}\u{1F619}\u{1F61A}\u{263A}\u{FE0F}\u{1F642}]/u;

// 自定义单词边界:将保护的Emoji视为单词的一部分
const customWordBoundary = new RegExp(
  `(?<=(?:\\w|${protectedEmojis.source}))(?!(?:\\w|${protectedEmojis.source}))|(?<!(?:\\w|${protectedEmojis.source}))(?=(?:\\w|${protectedEmojis.source}))`,
  'u'
);

// 构造最终的分割正则:最多21个字符,在自定义边界或字符串结尾分割
const splitRegex = new RegExp(
  `.{1,21}(?:${customWordBoundary.source}|$)`,
  'gu'
);

// 使用示例
const exampleText = "Hello there 😊 This is a longer string that needs splitting with 😋 and 😎 emojis included";
const result = exampleText.match(splitRegex).map(s => s.trim());

console.log(result);

代码说明

  1. u标志:开启Unicode模式后,正则会按实际的Unicode字符(码点)处理,而不是UTF-16代码单元,确保Emoji被当作单个字符计数。
  2. protectedEmojis字符集:包含了你列出的所有目标Emoji的Unicode码点,确保这些Emoji被视为单词的一部分。
  3. customWordBoundary:重新定义了单词边界,只有在“单词字符+保护Emoji”和其他字符之间才会触发分割,避免了Emoji被孤立。
  4. splitRegex:匹配最多21个字符,然后在自定义边界或字符串结尾处分割,完美保留你的目标Emoji。

简化版实现

如果你觉得自定义边界太复杂,也可以用更简洁的方式直接调整正则,跳过\b改用负向断言确保不会在保护Emoji前分割:

const splitRegex = /(?:.{1,21}(?<![\u{1F60A}\u{1F60B}\u{1F60E}\u{1F60D}\u{1F618}\u{1F617}\u{1F619}\u{1F61A}\u{263A}\u{FE0F}\u{1F642}])\b|.{1,21}(?:[\u{1F60A}\u{1F60B}\u{1F60E}\u{1F60D}\u{1F618}\u{1F617}\u{1F619}\u{1F61A}\u{263A}\u{FE0F}\u{1F642}]+$)?)/gu;
const result = exampleText.match(splitRegex).map(s => s.trim());

这个版本的逻辑是:要么匹配最多21个字符且结尾不是保护Emoji、在传统单词边界分割;要么匹配最多21个字符且结尾是保护Emoji(直接包含,不需要边界)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:50:06