2013-01-06 27 views
1

我想解析一個使用正則表達式的電子郵件回覆。我的回覆如下所示:Perl正則表達式匹配第一個實例?跨越多行

This is my response. 
Some text here 

? 



? 



From: Lastname, Firstname 

Sent: Saturday, January 05, 2013 7:37 PM 

To: Lastname, Firstname 

Subject: Some Subject 



? 



Some Text 

我有興趣解析所有內容嗎? 我曾嘗試利用單線模式與$response =~ /^(.*)\?\n/s;。但那會讓我回到最後?任何幫助,將不勝感激。

回答

6

.*是貪婪的。非貪婪版本.*?應該工作。

+0

這工作做。謝謝! – kamix

0

您需要爲.*非貪婪模式:

$response =~ /^(.*?)\?\n/s 
4

到目前爲止,最有效的方式做,這是一個否定的字符類:

while ($response =~/([^?]* \?) /xg) { ... } 
+1

+1,但效率是虛假的偶像 – Borodin

+3

螺桿效率,這是比非貪婪的修改器更可靠和可維護。例如添加到模式不會破壞這一點。 – ikegami

0

這不是neccesarry做用不懂的表達方式。您可以通過

/^((?:(?!^\?).)*)/sm 

匹配所有文字,第一行開始?,如果你只想匹配第一個?

/^([^?]*(?=\?))/s 
+0

非常感謝未評論的downvotes ...我喜歡它 - – bukart

+1

我不知道downvote的原因 - 它不是我的 - 但我會鼓勵你基準這個和其他解決方案由別人提供的輸入顯着變化在長度和構成上。您可能會對先行解決方案可能變得多慢感到驚訝。 – tchrist

+0

+1 upvoted you buddy ..分享當它發生的痛苦:) – Matical