JavaScript 如何检测一个字符串是否只包含 Unicode 表情符号?

5

我使用以下函数替换字符串中的表情符号,效果很好:

function doEmoji(s){
    var ranges = [
        '\ud83c[\udf00-\udfff]', // U+1F300 to U+1F3FF
        '\ud83d[\udc00-\ude4f]', // U+1F400 to U+1F64F
        '\ud83d[\ude80-\udeff]'  // U+1F680 to U+1F6FF
    ];
    var x = s.toString(16).replace(new RegExp(ranges.join('|'), 'g'),' whatever ');
    return x;
};

现在我想检查该字符串是否只包含表情符号或空格字符。 我这么做的原因是,如果没有其他字符(除了空格),我想仅替换表情符号。
一些例子:
Hello how are you?  //do nothing
‍‍ // replace emojis
‍‍  // replace emojis

我正在寻找一个简单的解决方案,也许是一个正则表达式。 谢谢


1
锚定重复的选择项应该可以解决问题:/^(?:alternative1|alternative2|alternative3)*$/.test(str) - T.J. Crowder
你的代码已经有了那个正则表达式。 - melpomene
3个回答

6

只需进行轻微调整即可确定字符串是否仅包含表情符号和空格...

const ranges = [
  '\ud83c[\udf00-\udfff]', // U+1F300 to U+1F3FF
  '\ud83d[\udc00-\ude4f]', // U+1F400 to U+1F64F
  '\ud83d[\ude80-\udeff]', // U+1F680 to U+1F6FF
  ' ', // Also allow spaces
].join('|');

const removeEmoji = str => str.replace(new RegExp(ranges, 'g'), '');

const isOnlyEmojis = str => !removeEmoji(str).length;

这个范围不适用于像‍‍♂️这样的表情符号。 使用此范围,它可以完美地工作:https://dev59.com/-GAf5IYBdhLWcg3wQg1t#42236875 - Igor O
这个范围不完整。请使用\p{Emoji}代替。https://dev59.com/kGMk5IYBdhLWcg3w6x_h#64007175 - Nino Filiu

3

如果您不想要任何依赖项,可以使用一个简单的解决方案:

containsOnlyEmojis(text) {
  const onlyEmojis = text.replace(new RegExp('[\u0000-\u1eeff]', 'g'), '')
  const visibleChars = text.replace(new RegExp('[\n\r\s]+|( )+', 'g'), '')
  return onlyEmojis.length === visibleChars.length
}

它从Unicode字符集中删除所有常规字母和符号的字符,但保留了表情符号和其他一些用途,在我们的使用情况下,这是可以接受的,但这可能是唯一的注意事项。

字符集范围来源:https://en.wikipedia.org/wiki/Unicode_block


这个范围不完整。请使用\p{Emoji}代替。stackoverflow.com/a/64007175/8186898 - Nino Filiu
@NinoFiliu 很好。 - Lucas C. Feijo

2

在2018/2019年,有更多的表情符号被添加进来,因此我对bholben的RegExp做了一些修改(来源:regextester.com):

"最初的回答"

const ranges = [
    '\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff]',
    ' ', // Also allow spaces
].join('|');

const removeEmoji = str => str.replace(new RegExp(ranges, 'g'), '');

const isOnlyEmojis = str => !removeEmoji(str).length;

这个范围不完整。请使用\p{Emoji}代替。https://dev59.com/kGMk5IYBdhLWcg3w6x_h#64007175 - Nino Filiu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接