为了账号安全,请及时绑定邮箱和手机立即绑定

为什么 Unicode 表情符号属性转义匹配数字?

为什么 Unicode 表情符号属性转义匹配数字?

杨__羊羊 2023-05-19 17:00:17
我发现这种使用Unicode 属性转义的不使用“巨大魔法范围”的正则表达式来检测表情符号的绝妙方法:console.log(/\p{Emoji}/u.test('flowers 🌼🌺🌸')) // true console.log(/\p{Emoji}/u.test('flowers')) // false注意到它\p{Emoji}也匹配数字!这是为什么?数字不是表情符号?console.log(/\p{Emoji}/u.test('flowers 123')) // unexpectdly true// regex-only workaround by @Bonzdragonconst 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 workaroundconst 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)
查看完整描述

1 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

digtis、、、#ZWJ*和更多字符包含Emoji设置为Yes 的属性,这意味着数字被认为是有效的表情符号字符


0023          ; Emoji_Component      #  1.1  [1] (#️)       number sign

002A          ; Emoji_Component      #  1.1  [1] (*️)       asterisk

0030..0039    ; Emoji_Component      #  1.1 [10] (0️..9️)    digit zero..digit nine

200D          ; Emoji_Component      #  1.1  [1] (‍)        zero width joiner

20E3          ; Emoji_Component      #  3.0  [1] (⃣)       combining enclosing keycap

FE0F          ; Emoji_Component      #  3.2  [1] ()        VARIATION SELECTOR-16

1F1E6..1F1FF  ; Emoji_Component      #  6.0 [26] (🇦..🇿)    regional indicator symbol letter a..regional indicator symbol letter z

1F3FB..1F3FF  ; Emoji_Component      #  8.0  [5] (🏻..🏿)    light skin tone..dark skin tone

1F9B0..1F9B3  ; Emoji_Component      # 11.0  [4] (🦰..🦳)    red-haired..white-haired

E0020..E007F  ; Emoji_Component      #  3.1 [96] (󠀠..󠁿)      tag space..cancel tag

例如,是一个数字,但与和字符1组合时变成表情符号:1️⃣:U+FE0FU+20E3


console.log("1\uFE0F\u20E3 2\uFE0F\u20E3 3\uFE0F\u20E3 4\uFE0F\u20E3 5\uFE0F\u20E3 6\uFE0F\u20E3 7\uFE0F\u20E3 8\uFE0F\u20E3 9\uFE0F\u20E3 0\uFE0F\u20E3")

如果要避免匹配数字,请使用Extended_PictographicUnicode 类


查看完整回答
反对 回复 2023-05-19
  • 1 回答
  • 0 关注
  • 144 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信