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