2

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

active(User, Server) ->
    do whatever.

我想对 User@Server 案例做的事情是这样的:

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

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

4

2 回答 2

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 符号分隔。如果匹配没有拉伸字符串的整个长度,它将失败:(^$)。

于 2013-01-16T21:57:18.143 回答
3

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

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

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

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

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

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

于 2013-01-16T23:37:10.460 回答