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

基于字符串格式的erlang匹配函数,erlang,Erlang,我有来自外部来源的用户信息,我需要检查该用户是否处于活动状态。有时我有一个用户和一个服务器,有时我有User@Server. 前一种情况没有问题,我只是: active(User, Server) -> do whatever. 我想用这个做什么User@Server案例类似于: active([User, "@", Server]) -> active(User, Server). 似乎不起作用。在erlang终端中使用a@b例如,我得到一个错误,没有匹配项。任

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

active(User, Server) ->
    do whatever.
我想用这个做什么User@Server案例类似于:

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

似乎不起作用。在erlang终端中使用a@b例如,我得到一个错误,没有匹配项。任何帮助都将不胜感激

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

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

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

在将模式与字符串进行匹配时,我认为有必要记住erlang字符串实际上是整数列表。因此字符串
“@”
实际上与
[64]
相同(64是
@
的ascii码)

这意味着您匹配的模式
[User,@],Server]
将匹配如下列表:
[97,[64],98]
,而不是
“a@b“
(列表形式为
[97,64,98]

要匹配字符串,需要执行
[用户,$@,服务器]
$
运算符为您提供字符的ascii值

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


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

请注意,任何人都可以查找用于电子邮件地址验证的正则表达式:。如果你想将用户名和服务器分开,你需要在其中添加组。一般提示:不要保留字符串。像@chops建议一样处理它们,并尽可能快地处理其他内容。与具有相同内容的字符串相比,更喜欢像
{User,Server}
这样的结构。在Erlang中这样做更为惯用,您的模式匹配现在可以工作了。