2012-01-05 65 views
3

(很抱歉的壞稱號,任何建議讚賞);-)正則表達式匹配一些給定格式文件名的條件?

好,考慮這些字符串:

first = "SC/SCO_160ZA206_T_mlaz_kdiz_nziizjeij.ext" 
second = "MLA/SA2_jkj15PO_B_lkazkl lakzlk-akzl.oxt" 
third = "A12A/AZD_KZALKZL_F_LKAZ_AZ__azaz___.ixt" 

我正在尋找一個正則表達式讓我得到這樣的陣列(在紅寶石):

first_array = ['SCO', '160ZA206', 'T', 'mlaz_kdiz_nziizjeij'] 
second_array = ['SA2', 'jkj15PO', 'B', 'lkazkl lakzlk-akzl'] 
third_array = ['AZD', 'KZALKZL', 'F', 'LKAZ_AZ__azaz___'] 

的第一場比賽必須在/之後和之前的第一_

權是什麼10

第二匹配必須是第一個和第二_

第三匹配必須是第二和第三_

最後匹配必須是第三_和最後.之間的任何東西之間的任何東西之間的任何

我不能得到它:[^\/].?([A-Z]*)_(.*)_(.*)[\.$] :-(

+1

ruby​​是否有一個範圍有限'分裂'功能?如果是的話,從第一個/最後一個字符串開始,然後用'_'分割,最多分爲三組:「數組」元素(如果這是Ruby中調用的)將包含你想要的。 – fge 2012-01-05 20:28:47

+2

+1很高興看到一個正則表達式的問題,其中OP在承包出棧之前付出了一些努力 – ean5533 2012-01-05 20:31:25

+0

@fge:不幸的是我不能使用'_'來分割我的字符串,最後一個匹配可能包含'_' 。 – 2012-01-05 20:39:18

回答

6

你是超級近。只需向第二個匹配器添加一個問號以使其懶惰(否則,它不會停在第一個下劃線處),然後複製該匹配器。

[^\/].?([A-Z]*)_(.*?)_(.*?)_(.*)[\.$] 
+0

不錯! Thx for your answer,the correct regexp is'[^ \ /]。?([AZ] *)_(。*?)_(。*?)_(。*)[\。$]'(我需要4匹配) – 2012-01-05 20:38:11

+0

糟糕,錯過了。 – 2012-01-05 20:56:39

+0

沒問題,它現在正在工作。 Thx – 2012-01-05 21:14:21

1

跟進@ FGE的分裂建議:

str = "SC/SCO_160ZA206_T_mlaz_kdiz_nziizjeij.ext" 
p str[(str.index('/')+1)...str.rindex('.')].split('_', 4) 
#=> ["SCO", "160ZA206", "T", "mlaz_kdiz_nziizjeij"] 

它在分割爲_最多4個元素(第四要素是餘數)。

+0

我不認爲他想'.ext','.oxt'等 – 2012-01-05 20:57:58

+0

@Dylan Markov - 你說得對,謝謝。重寫。 – steenslag 2012-01-05 21:10:53

+0

不錯,但Dylan Markow指出,必須刪除擴展。 – 2012-01-05 21:13:31