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

我发现这种使用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 @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

)


杨__羊羊
浏览 217回答 1
1回答

慕少森

digtis、、、#ZWJ*和更多字符包含Emoji设置为Yes 的属性,这意味着数字被认为是有效的表情符号字符:0023          ; Emoji_Component      #  1.1  [1] (#️)       number sign002A          ; Emoji_Component      #  1.1  [1] (*️)       asterisk0030..0039    ; Emoji_Component      #  1.1 [10] (0️..9️)    digit zero..digit nine200D          ; Emoji_Component      #  1.1  [1] (‍)        zero width joiner20E3          ; Emoji_Component      #  3.0  [1] (⃣)       combining enclosing keycapFE0F          ; Emoji_Component      #  3.2  [1] ()        VARIATION SELECTOR-161F1E6..1F1FF  ; Emoji_Component      #  6.0 [26] (🇦..🇿)    regional indicator symbol letter a..regional indicator symbol letter z1F3FB..1F3FF  ; Emoji_Component      #  8.0  [5] (🏻..🏿)    light skin tone..dark skin tone1F9B0..1F9B3  ; Emoji_Component      # 11.0  [4] (🦰..🦳)    red-haired..white-hairedE0020..E007F  ; Emoji_Component      #  3.1 [96] (󠀠..󠁿)      tag space..cancel tag例如,是一个数字,但与和字符1组合时变成表情符号:1️⃣:U+FE0FU+20E3console.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 类
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript