2017-05-06 99 views
2

我的工作对刮电子邮件在Ruby程序,因此简单地使用正则表达式,试图利用.match(/一些正则表达式/),只能是解决方案的一部分。对于任何语言的这个问题都没有完美的正则表达式。红宝石条件正则表达式的变通办法

要么表达式接受太多串,造成假阳性匹配,或有效的结果被排除。我正在使用一个正则表达式来处理电子邮件“验证”(实际上电子邮件“怀疑”是一个更为合适的术语),它会投射一个“广泛的网络”。

这一策略使我在阵列中存储的可疑地址,并通过迭代处理边缘的情况下最大限度地积极成果。这个问题围绕着一个特定的边缘案例展开。

采取例如字符串:

[email protected] 

的逻辑来处理这样示例串将清除包含@之间没有任何时间段的字符串,然后结束的字符串。

所以我们可能会寻找类似:

def purge_edge_case(array) 
    array.reject! { |s| s.<first_condition>? && s.<second_condition>? } 
end 

搞清楚两个基于字符串的条件是在哪里,我现在卡住。

+0

的可能的复制【什么是验证在Ruby中的电子邮件地址的最佳/简单的方法?(http://stackoverflow.com/questions/4776907/what-is - 最好的简单的方法来验证一个电子邮件地址在红宝石) – user000001

+0

我不这么认为。有许多正则表达式可以匹配用所有主要编程语言编写的电子邮件地址。问题是他们中没有一个是完美的。所以“不变”中的“网”无论是宽广还是过窄。在报废应用程序(这是我正在处理的)中,最佳解决方案是将网络广泛化,然后通过一系列步骤减少清单。这个问题代表了这样一个步骤。 – HMLDude

+0

我有点失落。什么是“有条件的正则表达式”?其次,你为什么要显示2个测试期限的条件?最后,就像你提到的那样,没有任何可见的解决方案,那么是什么让你认为你将创建一个? – grail

回答

2

没有必要对正则表达式的位置:

test = input.split('@') 
test.size == 2 && \ 
    && !test.last.starts_with?('.') \ 
    && !test.last.ends_with?('.') \ 
    && test.last.includes?('.') 

或不太严格,完全按照自己的要求:

test.size == 2 && test.last[/\./] # at least one dot after `@` 
0

这里是一个解决问题的完成方法:

def purge_edge_case(array) 
    array.reject! { |s| s.match(/@.*/).to_s != nil && s.match(/@.*/).to_s.match(/\./) == nil } 
end 
+0

地球上如何能够提升? 'to_s!= nil'是无稽之谈,整个答案就是代码异味和糟糕做法的完美例子。标记为mod注意力。 – mudasobwa

+1

@mudasobwa:只是好奇:为什么mod的关注? –

+0

@mudasobwa我相信有更清晰的方法来编写代码。但是宣布它为“废话”是无稽之谈!该代码实际上是有效的Ruby,不仅运行(没有错误,我可能会添加),但它也解决了我在我的问题中提出的问题。 – HMLDude