我认为您也可以使用 Unicode 字符属性。甚至 Unicode Consortium 自己也提供了一个 regex,它可以相对容易地针对 ECMAScript 进行调整(通过替换所有出现的\x
with\u
并将其全部放在一行中)。不过它确实选择了可能的表情符号,这意味着它会产生误报。明确建议在假设它们实际上是表情符号之前仍然验证所有匹配项。
这是该正则表达式的更严格版本,它会返回更少的误报,并带有一个迷你演示:
const sentence = 'A ticket to 大阪 costs ¥2000 👌. Repeated emojis: 😁😁. Crying cat: 😿. Repeated emoji with skin tones: ✊🏿✊🏿✊🏿✊✊✊🏿. Flags: 🇱🇹🏴. Scales ⚖️⚖️⚖️.';
const regexpUnicodeModified = /\p{RI}\p{RI}|\p{Emoji}(\p{EMod}+|\u{FE0F}\u{20E3}?|[\u{E0020}-\u{E007E}]+\u{E007F})?(\u{200D}\p{Emoji}(\p{EMod}+|\u{FE0F}\u{20E3}?|[\u{E0020}-\u{E007E}]+\u{E007F})?)+|\p{EPres}(\p{EMod}+|\u{FE0F}\u{20E3}?|[\u{E0020}-\u{E007E}]+\u{E007F})?|\p{Emoji}(\p{EMod}+|\u{FE0F}\u{20E3}?|[\u{E0020}-\u{E007E}]+\u{E007F})/gu
console.log(sentence.match(regexpUnicodeModified));
这将记录以下内容:
> Array ["👌", "😁", "😁", "😿", "✊🏿", "✊🏿", "✊🏿", "✊", "✊", "✊🏿", "🇱🇹", "🏴", "⚖️", "⚖️", "⚖️"]
这意味着它匹配:
- 简单的表情符号
- 带有修饰符的表情符号(肤色)
- 国旗
- 地区标志
- 表情符号呈现序列
请注意,我不知道这如何用于用图像替换特定的表情符号,正如 OP 所希望的那样,但它确实可以将表情符号放在额外的标签中等等。