有没有办法检查一个字符串在erlang中是否是字母数字
Is there a way to check if a string is alphanumeric in erlang
我正在使用 erlang 从 Twitter 收集推文,我试图只将主题标签保存到数据库中。但是,当我将位串转换为列表字符串时,所有非拉丁字母推文都会转换为奇怪的符号。
有什么方法可以检查字符串是否只包含 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_to_list
。请改用 unicode-module。 Unicode 二进制字符串不能 naiveley 解释为二进制,例如 UTF-8 字符编码有一些特殊的限制来防止这种情况。例如:第一个字符的最高位决定,是否为多字节字符。
我从 this site 中获取了以下示例,让我们定义一个 UTF8 字符串:
Utf8String = <<195, 164, 105, 116, 105>>.
将 naiveley 解释为二进制它产生:
binary_to_list(Utf8String).
"äiti"
使用 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 >= [=10=], Char =< ->
is_alpha(Rest);
is_alpha([]) ->
true;
is_alpha(_) ->
false.
对于其他编码,你可以添加他们的代码范围并添加它们。
有三个 io_lib 函数专门用于此:
io_lib:printable_list/1
io_lib:printable_latin1_list/1
io_lib:printable_unicode_list/1
-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 可能会感兴趣:
我正在使用 erlang 从 Twitter 收集推文,我试图只将主题标签保存到数据库中。但是,当我将位串转换为列表字符串时,所有非拉丁字母推文都会转换为奇怪的符号。 有什么方法可以检查字符串是否只包含 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_to_list
。请改用 unicode-module。 Unicode 二进制字符串不能 naiveley 解释为二进制,例如 UTF-8 字符编码有一些特殊的限制来防止这种情况。例如:第一个字符的最高位决定,是否为多字节字符。
我从 this site 中获取了以下示例,让我们定义一个 UTF8 字符串:
Utf8String = <<195, 164, 105, 116, 105>>.
将 naiveley 解释为二进制它产生:
binary_to_list(Utf8String).
"äiti"
使用 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 >= [=10=], Char =< ->
is_alpha(Rest);
is_alpha([]) ->
true;
is_alpha(_) ->
false.
对于其他编码,你可以添加他们的代码范围并添加它们。
有三个 io_lib 函数专门用于此:
io_lib:printable_list/1
io_lib:printable_latin1_list/1
io_lib:printable_unicode_list/1
-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 可能会感兴趣: