JavaScript:判断字符串末尾是否有表情符号并获取其真实长度
检测字符串末尾的表情符号并获取其字符长度
问题场景
需要处理三类字符串:
var string = "🌲🥒 Hello 👋 world!😂"; // 末尾表情长度:2个字符("😂".length = 2) var string = "🛁 Hello world! 👨👩👧"; // 末尾表情长度:8个字符("👨👩👧".length = 8) var string = "🥒 Hello world!"; // 末尾无表情
核心需求:
- 判断字符串末尾是否存在表情符号
- 获取该表情符号的字符长度
现有方案局限:仅能检测双字符的单个表情,无法识别👨👩👧这类由零宽连接符(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
相关产品推荐
相关产品推荐

