2011-03-17 27 views
0

我想這樣做以下列方式相匹配的大型多行文本匹配:怎麼把幾個正則表達式模式依次在Perl

我有幾個匹配模式:

$text =~ m#finance(.*?)end#s;

$text =~ m#<class>(.*?)</class>#s;

$text =~ m#/data(.*?)<end>#s;

如果任一個匹配,則打印結果print $1,然後繼續與其餘的文本再次匹配的三種模式。

我怎樣才能得到他們在整個文本中出現的順序打印結果?

非常感謝您的幫助!

回答

5
while ($text =~ m#(?: finance (.*?) end 
        | <class> (.*?) </class> 
        | data (.*?) </end> 
       ) 
       #sgx) { 
    print $+; 
} 

應該這樣做。

$+是成功匹配的最後一個捕獲組。

/g修飾符專門用於這種用法;它將正則表達式轉換爲一個迭代器,當它恢復時,繼續匹配,而不是在$text開始處重新開始。

(而/x讓您隨心所欲的使用空格,這意味着你可以讓你的正則表達式可讀,或者爲可讀,因爲他們得到,至少。)

如果您需要處理多個捕獲,就變成了有點難度,因爲你不能使用$+。但是,您可以測試捕獲組爲define d:

​​
+0

@geekosaur,+1,謝謝! – 2011-03-18 00:58:36

+1

分支重置運算符在這裏很有用:'(?|⋯|⋯|⋯|⋯)''。 – tchrist 2011-03-18 13:23:30

+0

我習慣性地堅持5.00503兼容性,因爲那是我以前僱主的標準Perl。 (大學......) – geekosaur 2011-03-18 18:15:45