【发布时间】:2021-01-30 23:39:15
【问题描述】:
我发现了一种很棒的方法来使用不使用“巨大魔法范围”的正则表达式检测表情符号,方法是使用Unicode property escape:
console.log(/\p{Emoji}/u.test('flowers ????????????')) // true
console.log(/\p{Emoji}/u.test('flowers')) // false
但是当我分享这个知识in this answer,@Bronzdragon 注意到\p{Emoji} 也匹配数字!这是为什么?数字不是表情符号?
console.log(/\p{Emoji}/u.test('flowers 123')) // unexpectdly true
// regex-only workaround by @Bonzdragon
const regex = /(?=\p{Emoji})(?!\p{Number})/u;
console.log(
regex.test('flowers'), // false, as expected
regex.test('flowers 123'), // false, as expected
regex.test('flowers 123 ????????????'), // true, as expected
regex.test('flowers ????????????'), // true, as expected
)
// more readable workaround
const hasEmoji = str => {
const nbEmojiOrNumber = (str.match(/\p{Emoji}/gu) || []).length;
const nbNumber = (str.match(/\p{Number}/gu) || []).length;
return nbEmojiOrNumber > nbNumber;
}
console.log(
hasEmoji('flowers'), // false, as expected
hasEmoji('flowers 123'), // false, as expected
hasEmoji('flowers 123 ????????????'), // true, as expected
hasEmoji('flowers ????????????'), // true, as expected
)
【问题讨论】:
-
请注意,解决方法对于 '123 花 ????????????' 也失败了例如 - 应该返回 true,因为它肯定有表情符号。
-
为什么不直接删除所有数字然后进行检查?
-
问题不是如何解决它 (here is a fix),问题是为什么。否则,让我们关闭它。
-
我认为答案是here 以及该帖子之后的所有线程。 这不是错误。
#和0-9是Emoji字符,默认情况下具有文本表示,符合 Unicode 标准。 -
This post 更详细,您可能可以使用
/\p{Extended_Pictographic}/u正则表达式来匹配表情符号,除了一些仍然是表情符号的键帽基本字符。
标签: javascript regex emoji