是否可以检查JS中的字符串是否是一个表情符号?

问题描述 投票:9回答:1

问题很简单:我有一个字符串str,如何检查str是否是一个表情符号,没有别的?另外,我宁愿不使用其他库。

匹配"🍎""⛹🏿‍♂️""3️⃣",但不匹配"🍓a""𝕒""🍌🍀"

我在寻找解决方案时遇到了麻烦,但是到目前为止,我已经尝试了一些方法:


尝试的解决方案1-播放长度和...运算符

[我了解到,表情符号占用一个以上的字节,有些甚至占据4个字节,甚至更多...我们可以通过字符串的length属性进行测量:

console.log("🍎".length); // 2
console.log("🛡️".length); // 3
console.log("⛹🏿‍♂️".length); // 6

然后,我发现...运算符将其考虑在内并正确地分隔了数组中的表情符号-然后,我可以看到结果数组的length属性并检测它们是否不同。

str = "⛹🏿‍♂️";
if (str.length !== [...str].length) {
  // is emoji?
} else {
  // is not emoji
}

但是,这不会检查其他多字节字符,例如𝕡,其长度为2。另外,有些表情符号仍然很奇怪。


尝试的解决方案2-正则表达式,正则表达式

当然要研究正则表达式,但我尚未找到可行的解决方案。

This answer的正则表达式\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff]可以很好地检测字符串是否包含表情符号,但是将其应用于我的情况会产生很多问题。这是我的测试:

部分A-不带字符串正则表达式的开头/结尾(^$

  • 2A.1 str.match(regex)非常不一致,它分解了一些表情符号和其他一些无法使用的表情符号。我找不到一种方法来找出它是否甚至包含非表情符号字符或是否包含多个表情符号:
let regex = /(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff])/;

console.log("5️⃣".match(regex)); // [ '⃣', '⃣', index: 2, input: '5️⃣' ]
console.log("💡".match(regex)); // [ '💡', '💡', index: 0, input: '💡' ]
console.log("🌡️🌡️".match(regex)); // [ '🌡', '🌡', index: 0, input: '🌡️🌡️' ]
console.log("a⛅".match(regex)); // [ '⛅', '⛅', index: 1, input: 'a⛅' ]
  • [2A.2每当字符串中包含表情符号时,regex.test(str)返回true,这不是我要查找的行为:
let regex = /(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff])/;

console.log(regex.test("5️⃣")); // true - correct
console.log(regex.test("a")); // false - correct
console.log(regex.test("🌡️🌡️")); // true - should be false
console.log(regex.test("hello ⛅!")); // true - should be false

部分B-以字符串正则表达式的开头/结尾(^$

  • 2B.1由于某些原因,str.match(regex)在某些表情符号上返回null。我不知道为什么,但是我假设它与str.match(regex)为什么会在A部分中分解这些表情符号有一定关系:
let regex = /^(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff])$/;

console.log("5️⃣".match(regex)); // null
console.log("💡".match(regex)); // [ '💡', '💡', index: 0, input: '💡' ]
console.log("🌡️".match(regex)); // null
console.log("⛅".match(regex)); // [ '⛅', '⛅', index: 1, input: 'a⛅' ]
console.log("🍌🍀".match(regex)); // null
  • 2B.2 regex.test(str)将在与false上将返回null的相同表情符号上返回str.match(regex)
let regex = /^(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff])$/;

console.log(regex.test("5️⃣")); // false - should be true
console.log(regex.test("💡")); // true - correct
console.log(regex.test("🌡️")); // false - should be true
console.log(regex.test("⛅")); // true - correct
console.log(regex.test("🍌🍀")); // false - correct

C部分-其他正则表达式

  • 我发现了this one,但它给出了相似的不一致之处,尽管/(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff]|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c[\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a]|\ud83c[\udde6-\uddff]|[\ud83c[\ude01\uddff]|\ud83c[\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|[\ud83c[\ude32\ude02]|\ud83c\ude1a|\ud83c\ude2f|\ud83c[\ude32-\ude3a]|[\ud83c[\ude50\ude3a]|\ud83c[\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff])/g不同:
let regex = /^(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff]|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c[\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a]|\ud83c[\udde6-\uddff]|[\ud83c[\ude01\uddff]|\ud83c[\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|[\ud83c[\ude32\ude02]|\ud83c\ude1a|\ud83c\ude2f|\ud83c[\ude32-\ude3a]|[\ud83c[\ude50\ude3a]|\ud83c[\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff])$/g

console.log(regex.test("5️⃣")); // true - correct
console.log(regex.test("💡")); // false - should be true
console.log(regex.test("🌡️")); // false - should be true
console.log(regex.test("⛅")); // true - correct
console.log(regex.test("🍌🍀")); // false - correct
  • 这也很糟糕(基于第一次测试的第二次测试更改吗?]
let regex = /^(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff]|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c[\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a]|\ud83c[\udde6-\uddff]|[\ud83c[\ude01\uddff]|\ud83c[\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|[\ud83c[\ude32\ude02]|\ud83c\ude1a|\ud83c\ude2f|\ud83c[\ude32-\ude3a]|[\ud83c[\ude50\ude3a]|\ud83c[\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff])$/g

console.log(regex.test("⛹🏿‍♂️")); // false
console.log(regex.test("⛅")); // true
let regex = /^(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff]|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c[\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a]|\ud83c[\udde6-\uddff]|[\ud83c[\ude01\uddff]|\ud83c[\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|[\ud83c[\ude32\ude02]|\ud83c\ude1a|\ud83c\ude2f|\ud83c[\ude32-\ude3a]|[\ud83c[\ude50\ude3a]|\ud83c[\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff])$/g;

console.log(regex.test("⛹")); // true
console.log(regex.test("⛅")); // false

是否可以解决所有这些表情符号/ unicode / regex混乱?库/ api是唯一的方法吗?他们是如何做到的?

javascript node.js regex unicode emoji
1个回答
1
投票

首先,感谢您提供问题的详细信息。关于问题本身,我建议您检查经过许多人测试或使用的事物。

  1. emoji-regex库在npm上有超过1万次下载,并在github上提供了开源代码

但是我知道它仍然是库,它有问题,有时还有错误,也许您想完全控制这部分代码。

  1. [相当简单的Regex已在4000多种当前使用的表情符号上进行了测试。它易于使用和扩展。

这就是我可以为您提供的,但是对于您的确切情况,这可能还不够,所以只需尝试一下并根据您的需要进行更改。

© www.soinside.com 2019 - 2024. All rights reserved.