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

String 有没有办法检查erlang中的字符串是否为字母数字,string,erlang,alphanumeric,String,Erlang,Alphanumeric,我正在使用erlang从twitter收集推文,并试图只将哈希标记保存到数据库中。但是,当我将位字符串转换为列表字符串时,所有非拉丁字母tweet都会转换为奇怪的符号。 有没有办法检查字符串在erlang中是否只包含字母数字字符 最简单的方法是使用正则表达式 StringAlphanum = "1234abcZXYM". StringNotAlphanum = "1ZXYMÄ#kMp&?". re:run(StringAlphanum, "^[0-9A-Za-z]+$"). >&

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

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

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字符,请不要使用
binary\u to\u list
。改用新的。Unicode二进制字符串不能被解释为二进制,例如UTF-8字符编码有一些特殊的限制来防止这种情况。例如:第一个字符中的最高有效位决定它是否为多字节字符

我从中获取了以下示例,让我们定义一个UTF8字符串:

Utf8String = <<195, 164, 105, 116, 105>>.
使用unicode支持进行解释:

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

对于拉丁字符,可以使用此函数:

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.
当Char>=$a,Char=<$z-> 是α(Rest); 当Char>=$A,Char=<$Z-> 是α(Rest); 当Char>=$0,Char=<$9-> 是α(Rest); 是α([])-> 是的; 是α(α)-> 错。
对于其他编码,您可以添加它们的代码范围并添加它们

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

  • io\u库:可打印列表/1
  • io库:可打印拉丁列表/1
  • io库:可打印的unicode列表/1
这是:

查看io_lib文档:

附录

因为在Erlang a中研究这一主题并不总是那么容易,但是稍微宽泛一点的Q/a可能会引起兴趣:


解决主要问题不是更好吗?若要正确转换utf8编码的位字符串,请不要使用
binary\u To\u list
,而是使用
unicode
-module。对不起,我在erlang方面很差劲。什么意思?我可以使用unicode模块仅将拉丁字母tweets转换为list吗?不,这意味着如果您想要处理utf8编码的位字符串(所有特殊符号都正确表示),请使用适当的模块。对不起,我尝试使用unicode:characters_to_list/2,它可以正确地转换所有内容。然而,我不认为我将需要保存字母数字标签以外的其他任何方式。不过,我真的很感谢你的帮助。你不必道歉,我不久前就遇到过你的情况;-)是的,我试着用unicode转换成list,效果很好。非常感谢。不过我想我无论如何只需要字母数字的推特谢谢!这正是我需要的!
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.
-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).