【问题标题】:Regex to delete emojis from string正则表达式从字符串中删除表情符号
【发布时间】:2018-01-28 17:35:06
【问题描述】:

我有一个list of the Unicode emojis,我想从他们身上去掉表情符号(即只想要整个第一部分和行尾的名字)。示例行如下所示:

1F468 1F3FD 200D 2695 FE0F   ; fully-qualified # ????????‍⚕️ man health worker: medium skin tone
1F469 1F3FF 200D 2695        ; non-fully-qualified # ????????‍⚕ woman health worker: dark skin tone

(为简单起见,我删除了一些空格)。我想要匹配的是[non-]fully-qualified 部分以及# 和表情符号,所以我可以用sed 删除它们。我尝试了以下正则表达式

 sed -e 's/\<[on-]*fully-qualified\># *.+?(?=[a-zA-Z]) //g' 

它尝试匹配单词[non-]fully-qualified 一个空格、# 符号,然后是你能找到的任何东西(非贪婪)直到第一个字母,然后用空字符串替换它。

我想要这个输出:

1F468 1F3FD 200D 2695 FE0F   ; man health worker: medium skin tone
1F469 1F3FF 200D 2695        ; woman health worker: dark skin tone

我尝试了几个发布的答案都无济于事,此外,我正在尝试匹配两个边界之间的模式,这是我遇到的麻烦

编辑:我正在尝试在 git for windows 附带的 git bash 中运行命令

【问题讨论】:

  • 这对你有用吗? sed 's/\(.*;\).*#[^a-zA-Z]*\(.*\)/\1 \2/'
  • 您的 sed 脚本似乎正在尝试使用 PCRE,但没有 sed 版本支持 PCRE。您正在运行哪个 sed 版本 - GNU 或 OSX 还是其他?
  • @archimiro 似乎在做某事,但不会在所有情况下都删除整个事情。

标签: regex unicode sed emoji


【解决方案1】:

我仍然不太确定,但这可能有效:

sed 's/;.*fully-qualified\s*#[^a-zA-Z]*/; /'

这将替换任何分号;,后接任何字符.*,后接“完全限定”文本,后接任意数量的空格,后接井号,后接任何字符不是 a-zA-Z [^a-zA-Z],并用分号后跟空格替换所有内容。

为了确保[a-zA-Z] 仅捕获 a 到 zA 到 Z 而没有任何其他字符,这似乎是问题所在,快速修复只是该命令可能是使用LC_ALL=C:

LC_ALL=C sed 's/;.*fully-qualified\s*#[^a-zA-Z]*/; /' file

【讨论】:

  • 不,输出与我第三条评论here中发布的相同
  • @c4tich 好像是windows的问题,你可以试试用LC_ALL=C sed ...运行sed,例如:LC_ALL=C sed 's/;.*fully-qualified *#[^a-zA-Z]*/; /'
  • 这成功了!小心解释为什么?另外,我无法理解正则表达式中的最后一个分号...(为什么 [a-zA-Z] 匹配除[a-zA-Z] 之外的其他内容?)
  • 查找了 LC_ALL,发现了这个:unix.stackexchange.com/questions/87745/what-does-lc-all-c-do 似乎 LC_ALL 强制它将输入视为简单的 ASCII,而不是执行 Windows 正在做的任何事情来破坏编码并丢弃正则表达式。对未来来说,这似乎是一件很方便的事情。谢谢@archimiro
  • 更新了答案,英语如果不是我的母语而且我不是很流利,如有语法或拼写错误,请见谅,希望解释有用。
【解决方案2】:

我喜欢搜索我真正想要的东西,然后保留它。

这在我的测试中适用于 OS X:

sed -E 's/^([^#]+)#[^a-zA-Z\s]*(.*)$/\1 # \2/g'

编辑:我没有 Windows 版本的 sed 可以尝试,但也许这会起作用。没有那么精确,但简短而简单。

sed -e 's/#\s*[^a-zA-Z\s]*/# /g'

再次编辑:我的错,我再次阅读了这个问题,你想删除的不仅仅是表情符号。这个应该可以的。

sed -e 's/;[^#]*#\s*[^a-zA-Z\s]*/; /g'

【讨论】:

  • 还是不行。与@argimiro 的命令类似的输出
  • 输出是什么,与您的预期有何不同?第二个命令将您问题中的示例输入数据在您的机器上转换成什么?
  • 还是和上一个一样。这是输出:1F468 1F3FD 200D 2695 FE0F ; &lt;A8&gt;?&lt;U+200D&gt;⚕️ man health worker: medium skin tone 我认为它剥离了一些东西,因为你可以看到你在这里没有得到完整的表情符号
  • 这是一个奇怪的结果。也许一些关于编码的分歧导致 Windows 版本对什么构成空白有不同的想法。让我们尝试只搜索文字空格:sed -e 's/;[^#]*# *[^a-zA-Z ]*/; /g'
  • 不,同样的输出。
猜你喜欢
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
  • 2020-03-12
  • 2021-01-17
  • 2014-06-20
  • 1970-01-01
  • 1970-01-01
  • 2022-06-28
相关资源
最近更新 更多