2012-01-05 2 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___'] 

первый матч должен быть что-нибудь сразу после / и перед первым _

Второй матч должен быть чем-то между первым и вторым _

Третий матч должен быть чем-то между вторым и третьим _

Последний матч должен быть чем-то между третьим _ и последним .

Я не могу получить его: [^\/].?([A-Z]*)_(.*)_(.*)[\.$] :-(

+1

Имеет ли рубин ограниченную ограниченную функцию 'split'? Если да, возьмите подстроку справа от первого/до конца, а затем разделите ее на '_', с тремя группами максимум: элементы массива (если это то, что вызывается в ruby) будут содержать то, что вы хотите. – fge

+2

+1 Приятно видеть вопрос с регулярным выражением, в котором OP приложил некоторые усилия, прежде чем заключить контракт в stackoverflow. – ean5533

+0

@fge: к сожалению, я не могу разбить мою строку, используя '' _'', последнее совпадение может содержать '' _'' , –

ответ

6

Ты супер близко. Просто добавьте вопросительный знак ко второму совпадению, чтобы сделать его ленивым (в противном случае он не остановится при первом знаке подчеркивания), а затем дублирует его.

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

Ницца! Thx для вашего ответа правильное регулярное выражение '[^ \ /].? ([AZ] *) _ (. *?) _ (. *?) _ (. *) [\. $]' (Мне нужно 4) –

+0

Упс, пропустил это. –

+0

Нет проблем, теперь он работает. Thx –

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' и т. Д. –

+0

@ Дилан Марков - Вы правы, спасибо. Переписан. – steenslag

+0

Хорошая реализация, но, как указал Дилан Марков, расширение должно быть удалено. –

Смежные вопросы