如何替换字符串中包含肤色变体的emoji为指定字符
问题原因
你写的正则会匹配到9个项,核心原因有两个:
- 带肤色的emoji本质是由基础人形emoji + 肤色修饰符码点(🏽对应U+1F3FD) 组成的多码点Unicode序列,不是单个码点字符
- 正则的字符类
[]只能匹配单个Unicode码点,你把所有emoji直接放到字符类里,等价于把所有用到的独立码点都列进了匹配列表,会自动拆分多码点emoji分别匹配。你示例里的6个emoji总共包含9个独立码点(3个无肤色的各占1个,3个带肤色的各占2个),所以最终替换得到9个x。
正确实现方案
要把每个完整的emoji序列作为独立匹配项,注意要把更长的带修饰符的emoji放在正则匹配项的前面,避免先匹配到基础emoji导致长序列被拆分:
// 带肤色的长序列放前面,避免短匹配提前截断 const regex = /👨🏽|🧑🏽|👩🏽|👨|🧑|👩/gu; const s = '👨👨🏽🧑🧑🏽👩👩🏽'; const m = s.match(regex); // ["👨","👨🏽","🧑","🧑🏽","👩","👩🏽"] const r = s.replace(regex, 'x'); // "xxxxxx"
如果需要批量匹配所有人形+肤色的组合,可以用Unicode属性匹配的写法,兼容性支持ES2018+的运行环境:
// 匹配所有emoji基础字符 + 可选的肤色修饰符 const regex = /[\p{Emoji_Modifier_Base}\p{Emoji}][\p{Emoji_Modifier}]?/gu; const s = '👨👨🏽🧑🧑🏽👩👩🏽'; const r = s.replace(regex, 'x'); // "xxxxxx"
内容的提问来源于stack exchange,提问作者Manuel
相关产品推荐
相关产品推荐

