【问题标题】:Why is regex to match emojis also matching non-emoji symbols ( ' and " ) on mobile?为什么匹配表情符号的正则表达式也匹配移动设备上的非表情符号( ' 和 " )?
【发布时间】:2021-01-01 23:36:53
【问题描述】:

这是我在 Stack Overflow 上的第一个问题,希望能得到帮助。

我使用正则表达式从用户输入的文本中检测表情符号。我用来匹配表情符号的正则表达式是:

(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff])

但是,仅在移动设备上,它还匹配各种非表情符号,包括 '"

我已经尝试过其他正则表达式来匹配表情符号,但没有一个比这个更简洁或同样有效。

谁能帮帮我?


要实时查看问题,请将文本/表情符号/符号插入个人消息字段(使用移动设备):https://2050.cards/shop/birthday/eskimo-surprise/

示例输入:

不应该和不匹配:

Dear you, Happy Birthday.

应该匹配并且确实匹配:

Dear you ????, Thanks. ????

不应该但确实匹配(仅在移动设备上):

Dear you, let's all "hang out"

【问题讨论】:

  • 你能给出一些示例输入吗?您是匹配文本还是单个字符?
  • @simbabque 我们创建了电子贺卡,这是用户输入的信息,所以我们正在匹配文本。最多 125 个字符。例如:亲爱的XXX,生日快乐,来自YYY。我们无法创建带有表情符号的卡片,因此如果用户插入表情符号,请禁用“订购卡片”按钮。但是,目前如果用户在移动设备上订购卡并插入“•”或€,则该按钮将被禁用。
  • 我修复了您的帖子格式,但我认为您的示例中缺少欧元符号。我希望我没有破坏它。
  • 您的正则表达式似乎与 \u2019 等智能引号匹配。也许移动设备正在添加它们。
  • @BenjyB 如果您的环境支持,我喜欢 Steven Penny 的回答。

标签: javascript regex unicode emoji


【解决方案1】:

正确的做法是使用Unicode property escapes

const r = /\p{Emoji}/u;

const a = [
   'Dear you ?, Thanks. ?',
   'Dear you, Happy Birthday.',
   `Dear you, let's all "hang out" • spend some €`
];

for (const s of a) {
   const b = r.test(s);
   console.log(b);
}

这是supported with

  • Chrome 64 (2018)
  • Edge 79 (2019)
  • Firefox 78(2020 年 6 月)
  • 节点 10 (2018)
  • Safari 11.1 (2018)

【讨论】:

  • 从现在开始,我的生日贺卡将以“亲爱的你”开头...
  • @xdhmoore 一定要加入表情符号:亲爱的你???
  • @StevenPenny 我现在已经实现了这个解决方案并且它已经奏效了。非常感谢您在这方面的帮助。
猜你喜欢
  • 2018-10-11
  • 2013-01-09
  • 2017-01-24
  • 1970-01-01
  • 2012-01-11
  • 2014-04-11
  • 1970-01-01
  • 2014-09-01
  • 2014-05-21
相关资源
最近更新 更多