2011-12-07 162 views
1

我的問題有2個部分...非貪婪正則表達式失敗

首先,我想提取第一組由斜槓(在這種情況下,「12/56」)分隔的數字,而忽視第二組(如果存在)。

樣品字符串:

some text 12/56 34/67 ABCD1234 --Want to grab "12/56", but ignore "34/67" 
more text 14/58    DEFG5678 --Want to grab "14/58". 

我使用(\d\d\/\d\d)?爲圖案(非貪婪)試過了,但它不先打後停止。

其次,一旦上述問題解決,我還需要搶8位代碼之後(總會有一個8位數的代碼)。我想使用類似(\d\d\/\d\d)?.+([A-Z0-9]{8}),但是我覺得正確非貪婪搜索可以在其軌道阻止正則表達式。這可能嗎?

+0

只是爲了澄清,該字符串將是「一些文字12/5667分之34ABCD1234更多的文字14/58 DEFG5678」,你要搶12/56和14/58? 然後進一步你想要的代碼ABCD1234和DEFG5678? – Thorbear

+0

這是正確的..但是每個人都將在自己的路線(不像你的問題是如何發佈的)。我想獨立處理每條線;第一場比賽將成爲第一場比賽,第一組比賽將獲得第一個數值,第二組比賽將獲得8位數的字母數字代碼。如示例所示,我的問題是可選次級##/##的「跳過」。 – BigAl

回答

0

哪一個是你在使用這些正則表達式語言?你正在使用「查找」還是「匹配」方法?只要你使用「匹配」方法,你的最後一個例子(「類似」)幾乎應該像你期望的那樣工作 - 但我會刪除?數字的第一組後,除非你有這方面的具體需求:

(\d\d/\d\d).+([A-Z0-9]{8}) 

隨着使用「匹配」的方法,這將迫使兩個分組進行填充,爲了完成一個成功的匹配。

+0

如果他在一個字符串中有多個這樣的字符串,他可能需要一個?在。+之後,要阻止該模式進一步擴展,除非他通過某些修改器將其設置爲默認值 – Thorbear

+0

我將在VBA中執行此操作,但是我一直在www.regexpal.com上創建/測試此操作,這似乎是工作得很好......這是我的大腦不能正常工作! – BigAl

0
(\d\d/\d\d)\s+(?:\d\d/\d\d)?\s*([A-Z0-9]{8}) 

抓住第一但忽略所述第二組nn/nn字符串(如果存在的話),然後獲取下一個8個大寫ASCII字符alnum,假定只是空格將這些項目之間的。然後

結果將在組1和2。因此,例如在Python中,你會使用

reobj = re.compile(r"(\d\d/\d\d)\s+(?:\d\d/\d\d)?\s*([A-Z0-9]{8})") 
match = reobj.search(subject) 
if match: 
    first = match.group(1) 
    second = match.group(2) 
else: 
    print "No match!" 
+0

我看到......所以在這種情況下,必須把捕獲組放入,並忽略捕獲(「?:」),然後使該組成爲可選...非常好,謝謝! – BigAl

1

只需卸下?第一個捕獲組之後。

(\d\d\/\d\d).+([A-Z0-9]{8}) 

看到它here on Regexr,而在強調比賽將鼠標就可以看到捕獲組的內容。

說明:

隨着?你不把組「非貪婪」,你把它選。所以,因爲你行不以數字開頭,正則表達式跳過可選部分和配合下.+一切,直到你的最後一部分。

你並不需要在這裏「非貪婪」的行爲,你的模式將匹配第一次出現,你可以做一個量詞「ungreedy」,而不是一組。

+1

現在我看到了光!感謝您的解決方案。當我試圖「(\ d \ d \/\ d \ d)」並且看到它同時抓住時,我正在掛斷電話。我現在看到,將第二組與「兩者之間的任何組合」結合起來非常好。也感謝Regexr鏈接...非常有用的測試者! – BigAl