【问题标题】:Capture Single Emoji using Regex使用正则表达式捕获单个表情符号
【发布时间】:2021-10-27 20:01:31
【问题描述】:

在文本中出现的所有表情符号中,我想捕捉草莓表情符号 (????)。

使用谷歌我缩小了我的表达范围

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

(\ud83c[\ud000-\udfff])

这将我的搜索范围缩小到更少的表情符号,但仍能捕捉到其他表情符号:

???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ????

我发现每个表情符号都有自己的范围和 Unicode,EG 草莓 (????) 的范围是 6107-6108 和 Unicode (U+1F353),Apple (????) 的范围是 6086-6087 和Unicode (U+1F34E)。

如何进一步缩小正则表达式的范围,以便捕获单个表情符号而忽略其余部分?

【问题讨论】:

  • 什么语言?在这种情况下,这似乎尤为重要。
  • 例如,\N{Strawberry} 在 python 中可以正常工作
  • 我不知道你这里所说的“范围”是什么意思。你能提供更多关于你在谷歌上搜索的信息吗?

标签: regex unicode


【解决方案1】:

unicode-table.com 这样的资源将提供您需要的关于代码点的所有信息,包括名称、字形表示,以及最重要的编码。对于草莓,您有以下内容:

名称:草莓
字形:?
代码:0x1F353
UTF-8:\xF0 \x9F \x8D \x93
UTF-16(BE):\uD83C \uDF53
UTF-32(BE):\U0001F353

您如何表示您的搜索字符串取决于您的正则表达式的语言/风格。例如,regex101.com 对 Unicode 的支持往往很少,因此您有两种选择:

  1. 字面草莓:

    /?/

  2. UTF-16(大端):

    /\uD83C\uDF53/

像 python 这样的语言有更多的支持,您可以使用上面小表中的任何选项以及适当的转义:

  1. '\N{Strawberry}'
  2. '\U0001F353'
  3. '\uD83C\uDF53'
  4. '?'

所有这些都等同于文字草莓字形:这些转义由解释器解析,而不是正则表达式引擎。

关键是 Unicode 是一个非常有据可查的资源。它可能看起来很复杂,而且通常很复杂,但您会发现从长远来看,查找适当的文档总是比详尽的猜测和检查更容易。

我强烈推荐阅读Python's Unicode HowTo。它并不详尽,但却是一个很好的资源,可以为您指明所有正确的方向。

【讨论】:

    【解决方案2】:

    我不知道是否有一种智能方法可以找到它,但您已经缩小了很多范围。经过反复试验,我找到了完全匹配的:

    \ud83c\udf53
    

    https://regex101.com/r/7psOg1/1

    编辑:经过一些研究,您似乎需要一个 unicode 到 hex 转换器。网上有很多。只需粘贴您的表情符号,相关的 unicode 就会显示出来。例如,对于?,你得到 d83eded0 这意味着\ud83e\uded0 将匹配? 请注意,您必须选择 unicode 16 编码。

    【讨论】:

    • 这只是 UTF-16BE 表示。你在缩小什么范围?
    • 那么问题表明 \ud83c[\ud000-\udfff] 匹配草莓。所以我从那里搜索。不过,您的答案要好得多:您提供的资源使得从 UTF-16BE 编码重构正则表达式变得非常容易
    • 根据问题中的术语和尝试,我认为 OP 不知道如何使用 Unicode 并从头开始。整个缩小猜测和检查的范围真的让我很困惑。
    猜你喜欢
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 2015-01-20
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    相关资源
    最近更新 更多