2013-07-08 52 views
0

我試過幾種不同的正則表達式,但是我仍然無法得到$found返回結果。我在regexterster.com上測試了這些正則表達式,它與@domains中的示例顯示正匹配。Perl:正則表達式匹配不成功

我懷疑我在做一個非常noobish錯誤的位置:

use strict; 
use warnings; 

my @domains = ('apples.eat-healthy.com', 'seeds.for-parrots.co.nz', 'spam.sender.info'); 

my $domain_patterns = qr/ 
    [A-Z0-9-]+\.[A-Z0-9]{3}$| 
    [A-Z0-9-]+\.[A-Z0-9]{2}\.[A-Z0-9]{2}$| 
    [A-Z0-9-]+\.[A-Z0-9]{4}$ 
    /x; 

foreach my $domain (@domains) { 
    if (my ($found) = $domain =~ m/($domain_patterns)/i) { 
     print "Found: $found\n"; 
    } 
} 

可能有人請指出我在做什麼錯誤?

+0

[域:: PublicSuffix(HTTP:// search.cpan.org/perldoc?Domain::PublicSuffix)可能對你有用。 – ikegami

+0

@ikegami謝謝。我會研究這一點。 –

+0

我覺得有趣的是,regextester.com默認設置爲「i」,「g」,「m」和「s」標誌(不區分大小寫,全局,多行和新行計爲空格)對於我所知道的任何語言來說,無疑是造成OP的困惑的原因。 – dodgethesteamroller

回答

3

/i需要在qr//上。

我認爲這是可以通過最好的例子來解釋:

my $re1 = qr/B/i; 
my $re2 = qr/C/; 

/A$re1$re2/i 

# ABC matches 
# aBC matches (Because of /i on /A/i) 
# AbC matches (Because of /i on qr/B/i) 
# ABc doesn't match (C must be uppercase because of lack of /i on qr/C/) 
+0

不錯。使用'/ xi;'使它工作。那是對的嗎? –

+0

是的,我的意思是'我'應該被添加。不應該刪除'x'。 – ikegami

+0

當使用're'調試''檢查這些正則表達式似乎做了很多回溯。換句話說:他們看起來效率很低。 – TLP

3

要麼添加不區分大小寫的修改或改變你的表達式:

[A-Za-z0-9\-]+\.[A-Za-z0-9]{3}$| 
[A-Za-z0-9\-]+\.[A-Za-z0-9]{2}\.[A-Za-z0-9]{2}$| 
[A-Za-z0-9\-]+\.[A-Za-z0-9]{4}$