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