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

JavaScript:判断字符串末尾是否有表情符号并获取其真实长度

检测字符串末尾的表情符号并获取其字符长度

问题场景

需要处理三类字符串:

var string = "🌲🥒 Hello 👋 world!😂"; // 末尾表情长度:2个字符("😂".length = 2)
var string = "🛁 Hello world! 👨‍👩‍👧"; // 末尾表情长度:8个字符("👨‍👩‍👧".length = 8)
var string = "🥒 Hello world!"; // 末尾无表情

核心需求:

  1. 判断字符串末尾是否存在表情符号
  2. 获取该表情符号的字符长度

现有方案局限:仅能检测双字符的单个表情,无法识别👨‍👩‍👧这类由零宽连接符(ZWJ)组合的复合表情,也无法获取其真实长度。

解决方案

利用Unicode正则属性类,匹配完整的末尾表情序列(覆盖单个表情和ZWJ连接的复合表情),实现代码如下:

// 正则:匹配字符串末尾的完整表情序列(支持复合表情)
const emojiEndRegex = /(?:\p{Extended_Pictographic}(?:\u200D\p{Extended_Pictographic})*)+$/u;

function checkEndEmoji(str) {
  const matchResult = str.match(emojiEndRegex);
  if (matchResult) {
    return {
      hasEmoji: true,
      emojiLength: matchResult[0].length
    };
  }
  return {
    hasEmoji: false,
    emojiLength: 0
  };
}

// 测试用例
console.log(checkEndEmoji("🌲🥒 Hello 👋 world!😂")); 
// 输出:{ hasEmoji: true, emojiLength: 2 }
console.log(checkEndEmoji("🛁 Hello world! 👨‍👩‍👧")); 
// 输出:{ hasEmoji: true, emojiLength: 8 }
console.log(checkEndEmoji("🥒 Hello world!")); 
// 输出:{ hasEmoji: false, emojiLength: 0 }

正则逻辑说明

  • \p{Extended_Pictographic}:匹配Unicode标准定义的单个基础表情符号
  • \u200D:匹配零宽连接符,这类字符用于组合多个基础表情形成复合表情(如家庭、职业表情)
  • (?:\u200D\p{Extended_Pictographic})*:匹配零个或多个「ZWJ+基础表情」的组合,覆盖所有复合表情的结构
  • +:确保至少匹配一个表情(单个或复合)
  • $:锚定字符串末尾,只检测末尾的表情
  • u标志:启用Unicode模式,让正则支持Unicode属性类的匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 17:20:48