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 ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.