如何将表情符号的变体替换为其他字符?
例如,?????????应生成xxxxxx,其中x是替换字符。请注意,每个表情符号都应该替换为一个x。
不起作用的是:
const regex = new RegExp('[?????????]', 'igu');
const s = '?????????';
const m = s.match(regex); // ["?","?","?","?","?","?","?","?","?"]
const r = s.replace(regex, 'x'); // xxxxxxxxx上面有9个匹配项,显然分别匹配/替换了一些代理。
为什么会这样呢?
发布于 2021-06-26 05:34:26
您可以按长度降序对emoji进行排序,然后使用RegExp构造函数动态构建正则表达式:
const arr = ['?','??','?','??','?','??'];
arr.sort((a, b) => b.length - a.length);
const regex = new RegExp(arr.join('|'), 'g');
const s = '?????????';
const m = s.match(regex);
console.log(m); // => ["?", "??", "?", "??", "?", "??"]
const r = s.replace(regex, 'x');
console.log(r); // => xxxxxx
发布于 2021-06-26 05:42:35
表情符号很复杂,每个基本符号(“表示”)后面都有一系列“修饰符”,这些修饰符为符号提供了额外的样式。如果你想知道所有的细节,请查看UTS 51 (你不想)。
在这种情况下,您必须匹配/替换表示符号,后跟一些修饰符,以使其作为完整的符号工作:
const s = '?????????';
const regex = /\p{Emoji_Presentation}\p{Emoji_Modifier}*/gu;
const m = s.match(regex);
console.log(...m, m.length) // 6
const r = s.replace(regex, 'x');
console.log(r, r.length) // 6
发布于 2021-06-26 05:46:19
我遇到了这种定义基本字符并添加可选修饰符的方法:
const regex = new RegExp('[???]??', 'gu');
const s = '?????????';
const m = s.match(regex);
const r = s.replace(regex, 'x');这类似于georg's answer。这里的优点是,它允许指定要匹配的特定肤色,因此正则表达式可以更细粒度。
https://stackoverflow.com/questions/68137190
复制相似问题