从Haskell中的一个字符串中删除所有表情符
我做了一个Mastodon/Twitter < - > IRC机器人。它工作得很好,但有人抱怨说,当人们在乳齿象上使用emojis时(这在某些用户名中似乎发生了很多..)它打破了他的终端。从Haskell中的一个字符串中删除所有表情符
我想知道是否有一种方法将它们发送到IRC之前卸下这些从字节串(或至少提供一个选项,这样做),谷歌上搜索了一下,我发现这一点:removing emojis from a string in Python
貌似\ U0001F600- \ U0001F64F应该是表情符号范围,如果我理解正确的话,但我从来没有使用过正则表达式。任何简单的方法将其转化为Haskell?我试着读了一下正则表达式,但是当我尝试时,我只得到“在字符'U'处的字符串/字符字面值词法错误',我假定语法必须是python的东西。
感谢
不是一个表情符或Unicode专家,但这似乎工作:
isEmoji :: Char -> Bool
isEmoji c = let uc = fromEnum c
in uc >= 0x1F600 && uc <= 0x1F64F
str = "wew"
丹尼尔·瓦格纳指出,这可制成甚至更好:
isEmoji :: Char -> Bool
isEmoji c = c >= '\x1F600' && c <= '\x1F64F'
演示in ghci:
λ> str
"\128513wew\128513"
λ> filter isEmoji str
"\128513\128513"
λ> filter (not . isEmoji) str
"wew"
说明:fromEnum
函数将字符转换为由Unicode定义的对应值Int
。我只是检查函数中的表情符号的Unicode范围,以确定它是否实际上是表情符号。
Unicode字符由单个反斜杠表示,接着任选的x
为十六进制,o
为八进制,没有用于表示字符[0]的十进制数:
putStrLn "\x1f600" --
这里,\x
为前缀Unicode中第一个表情符号的十六进制表示。
现在可以使用正则表达式删除表情符号,或者你可以简单地做:
emojis = concat [['\x1f600'..'\x1F64F'],
['\x1f300'..'\x1f5ff'],
['\x1f680'..'\x1f6ff'],
['\x1f1e0'..'\x1f1ff']]
someString = "hello "
removeEmojis = filter (`notElem` emojis)
putStrLn . removeEmojis $ someString -- "hello "
[0] Haskell Language 2010: Lexical Structure#Character and String Literals
谢谢,这确实有用!我与其他答案一起去了,因为我认为它更轻,但都达到了我所期望的 – Ulrar
看起来像它的伟大工程!非常感谢,它实际上比我预期的要简单得多。一个简单的> = Ulrar
不需要'fromEnum',只需'isEmoji c = c> ='\ x1f600'&& c
范围是0x1f000..0x1f9ff:http://unicode.org/emoji/charts/full-emoji-list.html – Artem