我想编写一个函数来检查输入是否是字符串,如下所示:
is_string(Input) ->
case check_if_string(Input) of
true -> {ok, Input};
false -> error
end.
Run Code Online (Sandbox Code Playgroud)
但我发现检查输入是否是Erlang中的字符串是很棘手的.Erlang中的字符串定义在这里:http://erlang.org/doc/man/string.html.
有什么建议?
提前致谢.
zxq*_*xq9 10
在Erlang中,字符串实际上可以是很多东西,所以有几种方法可以做到这一点,具体取决于你对"字符串"的确切含义.值得注意的是,Erlang中的每种字符串都是某种字符或词汇值的列表.
编码并不简单,特别是涉及Unicode时.字符几乎可以是任意高的值,lexemes在深整数列表中被整合在一起,而Erlang iolist()s(它们非常有用)是混合整数和二进制值的深层列表,它们在某些操作期间会自动展平和转换.如果您正在处理除可打印ASCII值的平面列表以外的任何内容,那么我强烈建议您阅读以下内容:
所以......这不是一个非常简单的问题.
该怎么办?
始终有效的快速答案:考虑数据的来源.
您应该知道您正在处理什么类型的数据,无论是通过套接字还是来自文件,或者特别是如果您自己生成它.但是,在系统的边缘,您可能需要一些帮助来净化数据,因为网络客户端会不时发送各种随机垃圾.
最常见情况的一些辅助函数存在于io_lib模块中:
true如果输入是unicode范围内的字符列表,则返回.true如果输入是合法字符的深层列表,则返回.true如果输入是Latin-1的深层列表(您的基本可打印ASCII值从32到126),则返回.true如果输入是Latin-1字符的平面列表,则返回(90%的时间这是你正在寻找的)true如果输入是可打印的Latin-1列表,则返回(如果以上不是你想要的,9%的时候这是你想要的那个)true如果输入是可打印字符的平面列表,则返回.true如果输入是可打印的unicode字符的平面列表,则返回(1%的时间这是你的问题 - 除了对于我们这里的一些人,我自己包括在日本,这涵盖了99%我的输入检查案例).对于更具体的情况,您可以使用re模块中的正则表达式,也可以编写自己的递归函数,以便在正则表达式不适合,不可能或可能使您容易受到正则表达式攻击的特殊情况下使用字符串.