Open utterances-bot opened 1 month ago
我试着使用了上面说的方法,例子中确实是有效的,比如最开始的例子
/\p{Extended_Pictographic}/gu.test("你好hello123😄hi🌷456🉐") // true`
然而它并非完全有效,比如某些单数字字符的emoji 可能是无效的(好像github 显示不出来)
4️⃣4️⃣4️⃣4️⃣
emiji 来自 https://emojipedia.org/keycap-digit-zero
如果看了 V8 那篇文章,在不考虑兼容性的情况下,带 v
应该是处理这些特殊字符的最好方式,如果是emoji ,那么应该使用
\p{RGI_Emoji}\gv
"你好4️⃣123🉐😄hi🌷".replaceAll(/\p{RGI_Emoji}/gv, "") // 你好123hi
"你好4️⃣123🉐😄hi🌷".replaceAll(/\p{Extended_Pictographic}/gu, "") // 你好4️⃣123hi
如果看了 V8 那篇文章,在不考虑兼容性的情况下,带
v
应该是处理这些特殊字符的最好方式,如果是emoji ,那么应该使用\p{RGI_Emoji}\gv "你好4️⃣123🉐😄hi🌷".replaceAll(/\p{RGI_Emoji}/gv, "") // 你好123hi "你好4️⃣123🉐😄hi🌷".replaceAll(/\p{Extended_Pictographic}/gu, "") // 你好4️⃣123hi
学习了,可惜 RegExp.prototype.unicodeSets 对于旧版本的一些浏览器兼容没那么好。
文章里只考虑到了 Emoji 的字符,但是 Emoji 还有序列的形式,还是得再看看规范,了解清楚 Emoji 是如何组成的。
如果不使用 /v
,可能使用别人整理好的 emoji-regex 来匹配要更靠谱,它整理了相对比较完整的 Emoji 列表组成正则,应该能符合大部分的使用场景了。
也可以试试这个:
/[\uD83C|\uD83D|\uD83E][\uDC00-\uDFFF][\u200D|\uFE0F]|[\uD83C|\uD83D|\uD83E][\uDC00-\uDFFF]|[0-9|*|#]\uFE0F\u20E3|[0-9|#]\u20E3|[\u203C-\u3299]\uFE0F\u200D|[\u203C-\u3299]\uFE0F|[\u2122-\u2B55]|\u303D|\uA9|\uAE|\u3030/gi
测试的 Emoji:
😄🉐1️⃣👋🧄🤝👩🏻🦼♥🫠👍🏽🇨🇳👨👩👧👨👩👧👨👩👧👨👩👧👨👩👧👨👩👧👨👩👧👨👩👧🏴☠️
以上 Emoji 这条正则都可以匹配。
Emoji 正则匹配 - Taxodium
""
https://taxodium.ink/post/emoji-regexp/