从Haskell中的字符串中删除所有表情符号

时间:2017-09-23 15:01:28

标签: regex haskell unicode

我做了一个乳齿象/推特< - > IRC机器人一会儿。它一直很好用,但是有人抱怨当人们在乳齿象上使用表情符号时(这似乎在某些用户名中发生了很多......)它打破了他的终端。

我想知道是否有办法在将它们发送到IRC之前从ByteStrings中删除它们(或者至少提供一个选项),谷歌搜索了一下我发现:removing emojis from a string in Python

如果我理解正确的话,看起来像\ U0001F600- \ U0001F64F应该是表情符号范围,但我从来没有使用正则表达式。任何简单的方法将其转换为Haskell?我试过读一下正则表达式,但是当我尝试时,我只得到“字符'U'中的字符串/字符文字中的词汇错误”,我认为语法必须是python的东西。

由于

2 个答案:

答案 0 :(得分:3)

Unicode字符由单个反斜杠表示,后跟可选的{16}表示十六进制,x表示八进制,没有表示字符[0]的十进制数字:

o

这里,putStrLn "\x1f600" -- 是Unicode中第一个表情符号字符的十六进制表示的前缀。

您现在可以使用RegExp删除表情符号,或者只需执行以下操作:

\x

[0] Haskell Language 2010: Lexical Structure#Character and String Literals

答案 1 :(得分:2)

不是表情符号或unicode专家,但这似乎有效:

isEmoji :: Char -> Bool
isEmoji c = let uc = fromEnum c
            in uc >= 0x1F600 && uc <= 0x1F64F

str = "wew"

Daniel Wagner指出,这可以做得更好:

isEmoji :: Char -> Bool
isEmoji c = c >= '\x1F600' && c <= '\x1F64F'

ghci中的演示:

λ> str
"\128513wew\128513"
λ> filter isEmoji str
"\128513\128513"
λ> filter (not . isEmoji) str
"wew"

说明:fromEnum函数将字符转换为Unicode定义的相应Int值。我只是检查函数中的unicode范围的表情符号,以确定它是否真的是表情符号。