2009-09-28 58 views
2

我一直在google搜索&想這個讓自己,但不能完全得到它...正則表達式來匹配指定分隔符之間的文本? (我只是無法得到它自己)

的問題:什麼正則表達式可用於選擇之間的文本(但不包括)分隔符文本。因此,作爲一個例子:

Start Marker=ABC 
Stop Marker=XYZ 

---input--- 
This is the first line 
And ABCfirst matched hereXYZ 
and then 
again ABCsecond matchXYZ 
asdf 
------------ 

---expected matches----- 
[1] first matched here 
[2] second match 
------------------------ 

感謝

+2

任何人閱讀這篇文章的快速評論 - 如果你正在看這個問題,因爲你想使用正則表達式進行XML解析,請不要。這是我經常看到人們試圖在#bash中做的事情,而且這是一個非常糟糕的想法 - XML解析令人驚訝地很難得到正確的解決方案,任何嘗試在正則表達式中捕獲語法錯綜複雜的嘗試都將失敗。使用爲此目的而構建的庫或工具 - 如果像在#bash中詢問的人一樣,您希望從shell腳本中使用某些內容,請參閱XMLStarlet。 – 2009-09-28 04:33:39

回答

10

標準或擴展正則表達式語法不能做到這一點,但它可以做的就是創建匹配組,然後可以選擇。例如:

ABC(.*)XYZ 

將存儲ABCXYZ作爲\1之間的任何東西(或稱爲組1)。

如果您使用的是PCREs(Perl兼容的正則表達式),則前瞻和後視聲明也可用 - 但組是更便攜和性能更好的解決方案。此外,如果您使用PCRE,則應使用*?確保該匹配不是非常貪婪,並將在第一時間終止。

您可以在Python解釋器測試這個自己(Python的正則表達式語法PCRE衍生):

>>> import re 
>>> input_str = ''' 
... This is the first line 
... And ABC first matched hereXYZ 
... and then 
... again ABCsecond matchXYZ 
... asdf 
... ''' 
>>> re.findall('ABC(.*?)XYZ', input_str) 
[' first matched here', 'second match'] 
+0

\ 1組包含「第一次匹配」和「第二次匹配」,或者第一個ABC到最後一個XYZ之間的所有內容? – kender 2009-09-28 04:19:07

+1

@kender - 要只有一個匹配,需要做兩件事情:多行標誌需要設置,而星號需要是貪婪的。否則,我們有兩個單獨的匹配,每個匹配都有自己的組。 – 2009-09-28 04:23:49

+0

我實際上使用C#,那麼我可能能夠在C#中獲得組(例如\ 1組)嗎? – Greg 2009-09-28 04:27:19

3

/ABC(.*?)XYZ/

默認情況下,正則表達式匹配是貪婪的。 '?'之後 。通配符,表示一個最小的匹配,從而使第一場比賽是這樣的:

first matched here 

...而不是這樣的:

first matched hereXYZ 
and then 
again ABCsecond match 
+0

@Sonam - 取決於正在使用的正則表達式語法 - 記住,我們有基本的,擴展的和Perl兼容的;只有最後一個人認爲問號是修改貪婪行爲。 – 2009-09-28 04:26:26

+0

。?將匹配零或一個charachter - 你還需要*或+ – 2009-09-28 04:33:50

+0

謝謝你們。是的,當然應該是。*?或。+?...我的正則表達式功能很弱,它的PCRE :) – 2009-09-28 04:43:44

0

您希望非貪婪的比賽,.*?

while($string =~ /ABC(.*?)XYZ/gm) { 
    $match = $1; 
} 
+0

(this perl ..有這麼多語言使用perl樣式正則表達式...)。 ;-) – 2009-09-28 04:31:14

相關問題