如何检查输入是否是Erlang中的字符串?

时间:2017-09-21 04:13:29

标签: erlang

我想编写一个函数来检查输入是否是字符串,如下所示:

is_string(Input) ->
  case check_if_string(Input) of
    true  -> {ok, Input};
    false -> error
  end.

但我发现检查输入是否是Erlang中的字符串很棘手。 Erlang中的字符串定义在这里:http://erlang.org/doc/man/string.html

有什么建议吗?

提前致谢。

2 个答案:

答案 0 :(得分:10)

在Erlang中,一个字符串实际上可以是很多东西,所以有几种方法可以做到这一点,具体取决于你的意思"字符串"。值得注意的是,Erlang中的每一种字符串都是某种字符或词汇值的列表。

编码并不简单,特别是涉及Unicode时。字符可以是几乎任意高的值,lexemes在深度整数列表中一起被全局化,而Erlang iolist() s(超级有用)是混合整数和二进制值的深层列表在某些操作期间自动展平和转换。如果您正在处理除可打印ASCII值的平面列表以外的任何内容,那么我强烈建议您阅读以下内容:

所以......这不是一个非常简单的问题。

如何应对所有困惑?

始终有效的快速回答:考虑数据的来源

您应该知道您正在处理什么类型的数据,无论是通过套接字还是来自文件,或者尤其是,如果您自己生成它。但是,在系统的边缘,您可能需要一些帮助来净化数据,因为网络客户端会不时发送各种随机垃圾。

最常见情况的一些辅助函数存在于io_lib模块中:

  • io_lib:char_list/1:如果输入是unicode范围内的字符列表,则返回true
  • io_lib:deep_char_list/1:如果输入是法律字符的深层列表,则返回true
  • io_lib:deep_latin1_char_list/1:如果输入是Latin-1的深层列表(您的基本可打印ASCII值从32到126),则返回true
  • io_lib:latin1_char_list/1:如果输入是 flat 拉丁字符1个字符列表,则返回true 90%的时间这是您的'重新寻找
  • io_lib:printable_latin1_list/1:如果输入是可打印的Latin-1列表,则返回true(如果以上不是您想要的,9%的时间这是您想要的那个)
  • io_lib:printable_list/1:如果输入是可打印字符的平面列表,则返回true
  • io_lib:printable_unicode_list/1:如果输入是可打印的unicode字符的平面列表,则返回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)。