Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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ю половину требование проверки отсутствия точки - которой там никогда не будет. Поздравляю, движку задана лишняя работа smile
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 состоит из цифр.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)