只匹配由一个或多个表情符号组成的字符串。

4

我想做的基本上就是匹配只包含表情符号且没有其他字符的字符串。它可以有一个或多个表情符号,只要没有其他字符即可。

我知道以前已经有类似的问题了,但是它们没有支持所有表情符号。

我正在使用以下方法检测表情符号,但不确定如何从中排除其他字符。

  const regex = /\p{Extended_Pictographic}/ug
  return regex.test(mystr);

以下是我的测试用例和预期结果:

    d‍❤️‍‍f -> false
    t -> false
    3 -> false
     -> true
    ❤️ -> true
     -> true
    ‍♂️ -> true
     -> true
     -> true

您可以在此处测试结果:https://regex101.com/r/krwZ7W/1

2
/^\p{Extended_Pictographic}+$/应该只匹配那些字符。但是看起来你的一些字符不在这个组中:https://regex101.com/r/Ya2C2C/1 - Nick
2
代码点序列被视为表情符号的规则相当复杂。我曾经编写了一个正则表达式来匹配每种情况(除了验证国家代码之类的事情),但它是用 Perl 编写的,不容易转换成 JavaScript。(如果我没记错的话,它也可能有20多行)。 - Shawn
2
@VahidAmiri 是的 - 但是如果您看我的演示并从正则表达式中删除 ^$,您会发现并不是所有的表情符号都匹配到该组。 - Nick
3
表情符号不仅存在于“扩展象形文字”组中,它们分布在许多组中。还有一个名为\p{Emoji}的组,甚至无法覆盖所有表情符号。 - Christopher
1
根据@outis的评论,这里有一个小的fiddle,它利用了正则表达式和那个答案中的信息。还有参考资料 - Christopher
显示剩余4条评论
1个回答

2
更新的答案: 以下内容基于Christopher的下面评论(他们提到这本身是基于outis的评论)。 Christopher的原始评论:

根据@outis的评论,这里有一个小的fiddle,它利用了那个答案中的正则表达式和信息。并且参考。

感觉现在它是“终极解决方案”。
isEmojiOnly(str) {
  const stringToTest = str.replace(/ /g,'');
  const emojiRegex = /^(?:(?:\p{RI}\p{RI}|\p{Emoji}(?:\p{Emoji_Modifier}|\u{FE0F}\u{20E3}?|[\u{E0020}-\u{E007E}]+\u{E007F})?(?:\u{200D}\p{Emoji}(?:\p{Emoji_Modifier}|\u{FE0F}\u{20E3}?|[\u{E0020}-\u{E007E}]+\u{E007F})?)*)|[\u{1f900}-\u{1f9ff}\u{2600}-\u{26ff}\u{2700}-\u{27bf}])+$/u;
  return emojiRegex.test(stringToTest) && Number.isNaN(Number(stringToTest));
}

旧回答: 以下内容无法处理数字表情符号和国旗等内容。

我想出了以下解决方案,不确定它是否可以通过所有测试用例,但应该足够好用。此函数将测试输入以查看其是否仅包含表情符号。

function isEmojiOnly(str) {
  // remove all white spaces from the input
  const stringToTest = str.replace(/ /g,'');
  const regexForEmojis = /\p{Extended_Pictographic}/ug;
  const regexForAlphaNums = /[\p{L}\p{N}]+/ug;

  // check to see if the string contains emojis
  if (regexForEmojis.test(stringToTest)) {
    // check to see if it contains any alphanumerics
    if (regexForAlphaNums.test(stringToTest)) {
      return false;
    }
    return true;
  }

  return false;
}

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