有没有办法检查字符串是否是erlang中的字母数字

时间:2015-11-30 12:29:11

标签: string erlang alphanumeric

我正在使用erlang从twitter收集推文,我试图仅将主题标签保存到数据库中。然而,当我将位串转换为列表字符串时,所有非拉丁字母的推文都转换为奇怪的符号。 有没有办法检查字符串是否只包含erlang中的字母数字字符?

3 个答案:

答案 0 :(得分:3)

有三个专门用于此的io_lib函数:

  • io_lib:printable_list/1
  • io_lib:printable_latin1_list/1
  • io_lib:printable_unicode_list/1

以下是an example of one in use

-spec show_message(ExParent, Message) -> ok
    when WxParent :: wx:wx_object(),
         Message  :: unicode:chardata() | term().

show_message(WxParent, Message) ->
    Format =
        case io_lib:printable_unicode_list(Message) of
            true  -> "~ts";
            false -> "~tp"
        end,
    Modal = wxMessageDialog:new(WxParent, io_lib:format(Format, [Message])),
    _ = wxMessageDialog:showModal(Modal),
    ok = wxMessageDialog:destroy(Modal).

查看io_lib文档:http://www.erlang.org/doc/man/io_lib.html#printable_list-1

<强>附录

因为这个主题并不容易在Erlang中进行研究,所以可能会对相关但稍微宽泛的Q / A感兴趣:

How to check whether input is a string in Erlang?

答案 1 :(得分:2)

最简单的方法是使用正则表达式。

StringAlphanum = "1234abcZXYM".
StringNotAlphanum = "1ZXYMÄ#kMp&?".

re:run(StringAlphanum, "^[0-9A-Za-z]+$").
>> {match,[{0,11}]}

re:run(StringNotAlphanum, "^[0-9A-Za-z]+$").
>> nomatch

你可以轻松地制作一个功能......

isAlphaNum(String) -> 
    case re:run(String, "^[0-9A-Za-z]+$") of
        {match, _} -> true;
        nomatch    -> false
    end.

但是,在我看来,更好的方法是解决潜在的问题,即unicode二进制字符串的正确解释。

如果要正确表示unicode-characters,请不要使用binary_to_list。请改用unicode-module。 Unicode二进制字符串不能解释为 naiveley 二进制,例如UTF-8字符编码有一些特殊的约束来阻止这种情况。例如:如果是多字节字符,则第一个字符中的最高有效位确定。

我从this site获取了以下示例,让我们定义一个UTF8-String:

Utf8String = <<195, 164, 105, 116, 105>>.

naiveley 解释为二元产生:

binary_to_list(Utf8String).
"äiti"

解释为unicode-support:

unicode:characters_to_list(Utf8String, utf8).
"äiti"

答案 2 :(得分:1)

对于拉丁字符,您可以使用此功能:

is_alpha([Char | Rest]) when Char >= $a, Char =< $z ->
    is_alpha(Rest);
is_alpha([Char | Rest]) when Char >= $A, Char =< $Z ->
    is_alpha(Rest);
is_alpha([Char | Rest]) when Char >= $0, Char =< $9 ->
    is_alpha(Rest);
is_alpha([]) ->
    true;
is_alpha(_) ->
    false.

对于其他编码,您可以添加他们的代码并添加它们。