2012-01-05 68 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