2011-02-11 108 views
0

什麼是正確的Perl regulat表達從文本文件中提取的電子郵件地址時,會根據本形式的書面提取電子郵件

有人在something.domainextension OR someone.someone在something.domainextension

是否有可能將這些地址轉換爲正常的電子郵件地址的正則表達式?

thanx提前

+0

這是一個重複的問題,你會在stackoverflow中找到很多答案。請記住,正確的電子郵件驗證不能使用正則表達式完成,不應該完成。見http://www.regular-expressions.info/email.html – 2011-02-11 17:04:09

回答

0

我使用Ruby,但它會是一樣的在Perl

>> "someone.someone at something.domainextension".sub(/\bat\b/,"@").gsub(/\s+/,"") 
=> "[email protected]" 

基本上剛剛替補 「在」 替換爲 「@」,並刪除所有空格。

0

我相信下面的代碼可以完成你的任務。然而,如果你的電子郵件地址是跨行分割的,它也不會起作用,如果你只有「at something.com」,它也會給你一個誤報。如果你可以發佈信息,我可以讓這段代碼更具體一些來處理你的情況您的數據集中的一些示例數據。

正如在上面的評論中指出的那樣,這絕對不會在RFC中找到任何有效的電子郵件地址,但我認爲它應該能夠解決您的問題。

my @lines_from_file; #holds our test info 

#load the test info 
$lines_from_file[0] = 'this is some text. We like to type to someone at somthing.com but sometimes'; 
$lines_from_file[1] = 'they go by someone.someone at something.com just to confuse us and hey you never'; 
$lines_from_file[2] = 'know, maybe they use parens like (someone at something.com).'; 
$lines_from_file[3] = 'make sure we do not find someone at .com. or someone something.com or someone at somethingcom'; 

my @all_email_addresses; #holds all found email addresses 


#foreach line in the file 
foreach my $line (@lines_from_file){ 
    while($line =~ /([0-9a-zA-Z.]+) #capture any number or letter or dot 1 or more times 
        \sat\s    #" at " 
        ([0-9a-zA-Z.]+  #capture any number or letter or dot 1 or more times 
        \.     #dot 
        \w{2,4})   #com or net or us or tv or info etc., 
        /xg){ 
     #everytime the line matches an email save the email in email form 
     push @all_email_addresses, "$1\@$2" ; 
    } 

} 

print "@all_email_addresses"; 
0
/^(?:(\w+)\.)?(\w+)\s+at\s+(\w+)\.(\w+)$/ 

這不會捕獲所有的電子郵件地址,只是那些你所提供的形式。