基于字符串格式的erlang匹配函数

时间:2013-01-16 20:39:30

标签: erlang

我有来自外部来源的用户信息,我需要检查该用户是否处于活动状态。有时我有User和Server,有时我有User @ Server。前一种情况没问题,我只是:

active(User, Server) ->
    do whatever.

我想对User @ Server案例做些什么:

active([User, "@", Server]) ->
    active(User, Server).

似乎不起作用。例如,当用@ b在erlang终端中调用active时,我得到一个没有匹配的错误。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:4)

您可以对字符串进行标记以获得结果:

active(UserString) ->
    [User,Server] = string:tokens(UserString,"@"),
    active(User,Server).

如果您需要更精细的内容,或者更好地处理电子邮件地址等内容,那么可能需要深入研究使用re模块的正则表达式。

active(UserString) ->
    RegEx = "^([\\w\\.-]+)@([\\w\\.-]+)$",
    {match, [User,Server]} = re:run(UserString,RegEx,[{capture,all_but_first,list}]),
    active(User,Server).

注意:提供的正则表达式几乎不足以进行电子邮件地址验证,它只是一个允许包含下划线(\\w),点的所有字母数字字符的示例(\\.)和破折号(-)由at符号分隔。如果匹配不延伸字符串的整个长度,它将失败:(^$)。

答案 1 :(得分:3)

关于模式匹配的说明,对于你的问题的真正解决方案,我认为应该使用@chops建议。

当匹配字符串的模式时,我认为记住erlang字符串实际上是整数列表是有用的。所以字符串"@"实际上与[64]相同(64是@的ascii代码)

这意味着您匹配模式[User, "@", Server]将匹配以下列表:[97,[64],98],但不匹配"a@b"(列表形式为[97,64,98])。

要匹配您需要执行的字符串[User,$@,Server]$运算符为您提供字符的ascii值。

但是,此匹配模式将匹配字符串限制为1个字符,后跟@,然后再增加一个字符......

可以通过执行允许服务器部分具有任意长度的[User, $@ | Server]来改进它,但User变量仍然只匹配一个单个字符(我看不到那个方法) )。