Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Perl: Общие вопросы > регулярное выражение, имя файла |
Автор: evya 5.1.2011, 14:47 |
Все с наступившим новым Годом! Помогите, имею файл My.File.Second.jpeg как мне выделить в две различных переменных $i="My.File.Second"; $ii="jpeg"; Если бы без точек разделил бы сам. |
Автор: DurRandir 5.1.2011, 15:03 |
my ($head, $tail) = $file =~ /(.*)\.(.*)/ |
Автор: evya 5.1.2011, 16:14 |
Спасибо большое!!!!!!!!!!!! а есть ли возможность расшифровать словами что именно значит /(.*)\.(.*)/ |
Автор: DurRandir 5.1.2011, 17:13 |
Она немного хитрая. Использует "жадность" оператора "*". Если переводить её дословно - то будет "захвати всю строку, потом отдай обратно всё до первого с конца (т.е. последнего - как раз он нам и нужен) символа точки, и во 2ю группу захватить остаток после точки до конца строки". |
Автор: vadiml 5.1.2011, 17:29 |
Регулярка, используяющая жадность, работает дольше чем с чётким определением, тем более без граничных маркеров. Лучше использовать /^(.*)\.([^.]+)$/ |
Автор: DurRandir 5.1.2011, 17:41 |
1) Всё, что начинается с .*, не требует ^ - оно сматчится в любом случае с начала, в крайнем случае дав пустую строку 2) Аналогично для $ и конечного .* 3) Фраза "Регулярка, используяющая жадность, работает дольше чем с чётким определением", в общем-то, верна, но в вашей регулярке - жадность осталась, единственный кусок, который будет отыгрываться назад - это, как раз, /(.*)\./ - его вы никуда не дели, зачем-то только навесив на 2ю половину требование проверки отсутствия точки - которой там никогда не будет. Поздравляю, движку задана лишняя работа ![]() 4) Если уходить от жадности, то тогда уж /(.*?)\.([^.]+)$/ (найдите 2 отличия, и вот здесь якорь $ обоснован), но она будет работать медленнее жадного варианта. Догадываетесь, почему?) |
Автор: vadiml 5.1.2011, 20:14 |
В версиях 5.8 и 5.10 был баг, в результате которого вариант /(.*)\.(.*)/ весьма притормаживал -- начинал делать лишние обходы в поисках дополнительных вариантов. Исправлен в 5.12 |
Автор: evya 5.1.2011, 21:39 |
Где в инете можно почитать об жадных регулярках |
Автор: DurRandir 5.1.2011, 22:31 |
>evya Хорошая книга по регуляркам - http://oreilly.com/catalog/9780596528126 >vadiml Я на 5.8.8 прогнал жадный вариант под use re 'debug' - он отработал ровно то, что должен по теории. М.б. там нужен какой-то более сложный пример. |
Автор: evya 5.1.2011, 23:11 |
Есть ли возможность выслать в pdf? |
Автор: DurRandir 6.1.2011, 00:34 |
Я её где-то в сети находил. |
Автор: evya 6.1.2011, 17:59 |
как к специалисту, подскажи еще по регулярке имею имя файла 802FILE.JPEG Необходимо отделить первые цифры от имени файла и само имя файла имя файла может быть 1File.jpeg 10File.jpeg 100File.gpeg 1000File.gpeg Добавлено через 8 минут и 20 секунд или немного проще есть имя файла 802FILE.JPEG есть переменная $id=802 как отделить в $file без $id |
Автор: DurRandir 6.1.2011, 18:23 |
Ну это же вообще простейшая) Тут даже perlretut достаточно. my ($num, $name) = $file =~ /^(\d+)(.*)/; |
Автор: evya 7.1.2011, 20:06 |
может я неправильно написал! есть имя файла 802FILE.JPEG есть переменная $id=802 как отделить в $file без $id т.е.$newfile="FILE.JPEG"; А вашем выражении нет $id my ($num, $name) = $file =~ /^(\d+)(.*)/; |
Автор: alezzz 7.1.2011, 20:56 |
Если найти файл который начинается на $id и записать в $newfile все что идет за $id,то так: my ($newfile)= $file =~ /^$id(.*)/; или, наверное, лучше так: my ($newfile) = $file =~ /^$id(\D.*)/; если $id состоит из цифр. |