2017-05-06 100 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