2012-05-25 5 views
0

Я ищу регулярное выражение для синтаксического анализа имени файла, чтобы подсчитать количество экземпляров, которые префикс имени файла. Вот некоторые примеры строкRegex для синтаксического анализа префикса строки

 
gloves.tga 
10jeans.jpg 
shirt1.png 
shirt2.png 
coat_00.png 
coat_12.gif 
top1_01.png 
top2_04.png 

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

Один кусок одежды может быть разбросан по нескольким файлам, указанным по названию одежды, за которым следует знак подчеркивания, а затем некоторые номера индексов, а затем расширение. Префикс - это все, но не включая подчеркивание. Все остальное можно игнорировать.

Это касается всех случаев, с которыми я работаю, но у меня возникают проблемы с тем, что в одном случае есть символ подчеркивания, а другой - нет.

Может кто-нибудь помочь мне придумать регулярное выражение для этого?

РЕДАКТИРОВАТЬ: Кажется, что есть дополнительное условие: рубашку1 и рубашку2 следует рассматривать как один и тот же префикс.

Так что, если за строкой следуют некоторые номера и сразу же следует расширение, то цифры следует игнорировать, тогда как если за номерами следует знак подчеркивания, они будут храниться в префиксе.

ответ

2

Не будет работать? (Perl/PCRE синтаксис)

/^([^._]+)/ 

Это будет захватить самый длинный префикс строки, которая не содержит периодов или подчеркивания.

EDIT: Хорошо, если shirt является префиксом в shirt1, то вы можете попробовать что-то вроде этого:

/^([^._]+)(?<!\d)/ 

который запрещает префиксов, которые заканчиваются цифрой. Однако это не будет работать в Ruby 1.8, так как 1.8 не имеет утверждений lookbehind.

EDIT 2: Вышесказанное означает, что префикс top1_01 является top, но мы хотим, чтобы один включать цифры до подчеркивания. Таким образом, наша последняя попытка добавить альтернативу:

/^([^._]+)(?:(?<!\d)|(?=_))/ 

Приставка имеет к либо не заканчивается в цифре или последует подчеркиванием. Демо:

%w<gloves.tga 10jeans.jpg shirt1.png shirt2.png 
    coat_00.png coat_12.gif top1_01.png top2_04.png>.each do |filename| 
    if m = filename.match(/^([^._]+)(?:(?<!\d)|(?=_))/) then 
    puts [ filename, m[1] ].join ":\t" 
    else 
    warn "Uh-oh, couldn't find a prefix in filename '#{filename}'." 
    end 
end  

Выход:

gloves.tga: gloves 
10jeans.jpg: 10jeans 
shirt1.png: shirt 
shirt2.png: shirt 
coat_00.png: coat 
coat_12.gif: coat 
top1_01.png: top1 
top2_04.png: top2 
+0

Хмм мне сказали shirt1 и shirt2 должны рассматриваться как же префиксом. Так что просто совпадение с подчеркиванием или периодом не работает =/ – MxyL

+0

Как насчет '10jeans' и' 11jeans'? То же или другое? И есть ли «top1» и «top2» тот же префикс в примерах «top1_blah» и «top2_blah»? –

+0

Ведущие номера в порядке. – MxyL

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