【问题标题】:Is there a way to check if a string is alphanumeric in erlang有没有办法检查一个字符串在erlang中是否是字母数字
【发布时间】:2016-03-04 02:18:00
【问题描述】:

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

【问题讨论】:

  • 解决主要问题不是更好吗?要正确转换 utf8 编码的位串,请不要使用 binary_to_list,而是使用 unicode-module。
  • 对不起,我很讨厌 erlang。你的意思是?我可以使用 unicode 模块仅将拉丁字母推文转换为列表吗?
  • 不,这意味着如果您想处理 utf8 编码的位串(所有特殊符号都正确表示),请使用正确的模块。
  • 对不起,我尝试使用 unicode:characters_to_list/2 并且它可以正确转换所有内容。但是,我认为无论如何我都不需要保存字母数字主题标签。不过,我真的很感谢您的帮助。
  • 不用解释了,我不久前也遇到过你的情况;-)

标签: string erlang alphanumeric


【解决方案1】:

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

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-String:

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

naiveley 解释为生成的二进制文件:

binary_to_list(Utf8String).
"äiti"

用 unicode-support 解释:

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

【讨论】:

  • 是的,我尝试使用 unicode 转换为列表,它可以工作。谢谢你。但是我认为无论如何我只需要字母数字推文
【解决方案2】:

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

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.

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

【讨论】:

  • 谢谢!这正是我需要的!
【解决方案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?

【讨论】:

    猜你喜欢
    • 2016-09-20
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2020-03-15
    • 2020-06-05
    • 1970-01-01
    • 2011-12-04
    • 2022-01-21
    相关资源
    最近更新 更多