从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范围,以确定它是否实际上是表情符号。

+0

看起来像它的伟大工程!非常感谢,它实际上比我预期的要简单得多。一个简单的> = Ulrar

+0

不需要'fromEnum',只需'isEmoji c = c> ='\ x1f600'&& c

+0

范围是0x1f000..0x1f9ff:http://unicode.org/emoji/charts/full-emoji-list.html – Artem

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

+0

谢谢,这确实有用!我与其他答案一起去了,因为我认为它更轻,但都达到了我所期望的 – Ulrar