LINUX.ORG.RU

Запара с regexp в ruby


0

0
Есть строки типа "filename.tar.bz2" нужно вставлять именам файлов суффиксы: "filename_xxx.tar.bz2" и так далее. Как это шустро сделать с regexp'ами?
anonymous
irb(main):001:0> suffix = "_new"
=> "_new"
irb(main):002:0> "filename.tar.bz2".gsub(/(.*)(\.tar\.bz2)/) { $1 + suffix + $2 }
=> "filename_new.tar.bz2"
volh ★★
()
Ответ на: комментарий от anonymous
> tar.bz2 лишь частный случай.

Ну и что? В моем примере достаточно заменить suffix на все что хочешь.

Не понимаю этого стремления использовать везде где нужно и не нужно регулярные выражения.

smh ★★★
()
Ответ на: комментарий от smh
>Не понимаю этого стремления использовать везде где нужно и не нужно регулярные выражения.

стремления-то нет, просто в первом сообщении говорилось о "строках вида n", а строки могут быть и полями в БД, и строками в plain-text\xml файле, и т.п.

volh ★★
()
Ответ на: комментарий от anonymous
если ты имеешь в виду расширение, то это File.extname. только он в руби идиотический малость, и на file.tar.gz выдаст ".gz"
volh ★★
()
Ответ на: комментарий от volh
Да именно так.

Блин, как изменить пример с регекспом чтобы он любые расширения обрабатывал. Тоесть чтобы $2 было равно строке после первой ".".

Я сделал, но это для последней "."

"filename.tar.bz2".gsub(/(.*)(\.)/) { $1 + "_suffix" + $2 }

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

anonymous
()
Ответ на: комментарий от anonymous
> Как я суффикс выдерну тебе без регулярки? Научи чтоли.

Нужно изначальный формулировать вопрос точнее. В твоем вопросе не сказано о том, что суффикс может быть каким угодно, а указан конкретно tar.gz.

2volh: если ты имеешь в виду расширение, то это File.extname. только он в руби идиотический малость, и на file.tar.gz выдаст ".gz"

Он не идиотический, а вполне нормальный. Нет никакой договоренности о том, что такое расширение файла, поэтому каждый как понимает, так и делает. Что в данном случае является расширение .tar.gz или .gz? Я сколнен думать, что .gz.

smh ★★★
()
мне кажется твоя задача не имеет общего решения: ты ищешь n-ый символ с конца, а для такого автомата нужно как минимум n состояний. это в свою очередь значит, что ты вынужден писать регексп для "*.бу", *.бу.бу*, "*.бу.бу.бу",... по отдельности (ну или один регекс в виде их композиции).
Pi ★★★★★
()
Ответ на: комментарий от Pi
Средствами regular expressions невозможно разбить строку вида "xxx.yyy.zzz.www" на "xxx" и "yyy.zzz.www" и вставить между ними prefix?
anonymous
()
s="filename.tar.bz2"
m=/(.*?)(\..*)/.match(s)
out=m[1]+"_suffix"+m[2]
anonymous
()
Ответ на: комментарий от anonymous
я такого не говорил, я лишь утверждаю, что универсальное решение будет вида

"filename.tar.sdfsd.bz2".reverse.gsub(/(.*\.)(.*)$/){ $2.reverse + "_suffix" + $1.reverse}
Pi ★★★★★
()
Ответ на: комментарий от Pi
а вообще-то оно выглядит так:

"filename.sgs.gsg".gsub(/^([^.]*)(.*)$/){$1+"_suffix_"+$2}

:)
Pi ★★★★★
()
Ответ на: комментарий от anonymous
ну, эмм, да. sub идет с начала, gsub с конца. однако)
volh ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.