我有来自外部来源的用户信息,我需要检查该用户是否处于活动状态。有时我有User和Server,有时我有User @ Server。前一种情况没问题,我只是:
active(User, Server) ->
do whatever.
我想对User @ Server案例做些什么:
active([User, "@", Server]) ->
active(User, Server).
似乎不起作用。例如,当用@ b在erlang终端中调用active时,我得到一个没有匹配的错误。任何帮助将不胜感激!
答案 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
变量仍然只匹配一个单个字符(我看不到那个方法) )。