2013-11-26 67 views
0

我用正則表達式很糟糕,並試圖在谷歌搜索,但我試過的一切都沒有奏效。Perl正則表達式匹配數組

這裏是我的代碼:

@liner = split(/\s+/, $_); 
foreach my $v (@liner) { 
    if ($v =~ /*.duplex.*/) { 
     print ECRIRE ";$v"; 
    } 
} 

$ V包含類似:「全雙工」,但也包含了其他的東西,如「半雙工,」 ......

所以我想我的條件匹配「任何字符」雙工「任何字符」。

我試過的東西if ($v =~ /(*.)duplex(.*)/)

和其他一些人,但沒有工作。誰能幫我嗎?

+2

第一個'* .'是無效的 - 它需要的是'*'。 – Christoph

回答

3
foreach (split(/\s+/)) { 
    print ECRIRE ";$_" if /duplex/i; 
} 

幸運的是,在Perl的正則表達式不匹配對整個字符串,這意味着你不必前綴和後綴的一切「 *」:

/abcd/ 

是同義

/.*abcd.*/ 

(除非你使用它增加了新行的字符相匹配的點某一特定的選項)

此循環匹配所有情況下的所有雙工(/ i使RegEx不區分大小寫)。

(未經測試,但手指交叉)

+0

天啊......我真是一個小孩......謝謝老兄的解釋! –

+0

甚至沒有編譯 – Borodin

+0

沒有Perl解釋器準備好。現在工作(測試)。 – 0xCAFEBABE

-1

List::MoreUtils模塊具有firstval功能,這將在滿足一定的約束列表中返回的第一個值。編寫簡潔易讀的代碼非常有用。它不是核心模塊,您可能需要安裝它。

正如其他人所說,你所需要的正則表達式是/duplex/,因爲這將檢查字符串包含的字符串。您可以使用/duplex/i來增強它,它會執行不區分大小寫的匹配。

最後,如果您正在編寫split /\s+/,那麼您幾乎可以肯定需要split ' ';這是一個字面單空間字符串,而不是正則表達式,如果您沒有提供第一個參數,則它是默認split。不同之處在於,如果目標字符串以空格開頭,則與/\s+/拼接將返回一個空字符串作爲列表的第一個元素,而使用' '它將只返回非空格字符。如果您根本沒有傳遞任何參數到split,那麼它相當於split ' ', $_,這通常是您想要的。

這個簡短的程序演示了這些觀點。

use strict; 
use warnings; 

use List::MoreUtils 'firstval'; 

$_ = 'simplex full-duplex half-duplex'; 

print firstval { /duplex/ } split; 

輸出

full-duplex