2013-01-16 55 views
2

我有来自外部源的用户信息,我需要检查该用户是否处于活动状态。有时候我有用户和服务器,有时候我有用户@服务器。前一种情况是没有问题的,我只是有:基于字符串格式的erlang中的匹配函数

active(User, Server) -> 
    do whatever. 

我愿与用户@服务器的情况下做的是一样的东西:

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

似乎并没有工作。例如,在使用@ b调用erlang终端中的活动时,出现没有匹配的错误。任何帮助,将不胜感激!

+1

一般提示:不要将字符串绕在一起。像@chops那样对他们进行处理,尽可能快地处理其他事情并处理它们。对于具有相同内容的字符串,建议使用“{User,Server}”这样的结构。在Erlang中这样做更为习惯,现在你的模式匹配工作。 –

回答

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),点(\\.)和破折号(-)分隔由一个符号。如果匹配不能延伸整个字符串的长度,将会失败:(^$)。

+2

对于任何正在寻找电子邮件地址验证正则表达式的人来说:[HTML 5标准有一个](http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-该型attribute.html#有效的电子邮件地址)。如果你想分离出用户名和服务器,你需要添加组。 – legoscia

3

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

在匹配字符串的模式时,我认为记住erlang字符串实际上是整数列表是很有用的。因此字符串"@"其实是一样的[64](64是ASCII码为@

这意味着你匹配模式[User, "@", Server]会匹配列表:[97,[64],98],但不"[email protected]"(其中以列表的形式是[97,64,98])。

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

然而此匹配模式限制了匹配的字符串是1个字符,接着@,然后一个或多个字符...

它可以通过执行[User, [email protected] | Server]它允许服务器部分具有任意长度来改善,但User变量仍然只能匹配一个单个字符(并且我没有看到解决方法)。

相关问题