Как использовать Matlab / Octave regexprep (замена регулярного выражения) для добавления суффикса к имени файла перед расширением

Скажем, у меня есть эта переменная Matlab или Octave char:

>> filename = 'my.file.ext'

Мне нужна команда regexprep, которая добавляет суффикс, скажем, «_old», к имени файла перед расширением, преобразуя его в «my.file_old.ext».

В следующем примере все точки заменяются на _old.:

>> regexprep(filename, '\.', '_old.')
ans =
    'my_old.file_old.ext'

Что такое команда regexprep, которая добавляет _old только к последней точке? (В идеале, если точки (без расширения) нет, добавьте в самый конец '_old'.)

Заранее спасибо!


person Felipe Jiménez    schedule 08.08.2020    source источник


Ответы (2)


Вы можете использовать

regexprep(filename, '^(?:(.*)(\.)|(.*))', '$3$1_old$2')

См. демонстрацию регулярного выражения

Подробности

  • ^ - начало строки
  • (?:(.*)(\.)|(.*)) - a non-capturing group matching either of the two alternatives:
    • (.*)(\.) - Group 1 ($1 backreference refers to the value of the group): any zero or more chars as many as possible and then Group 2 ($2): a dot
    • | - or
    • (.*) - Группа 3 ($3): любое количество символов, равное нулю или более, максимально возможное

Если альтернатива не найдена, обратная ссылка на группу захвата представляет собой пустую строку. Таким образом, если (.*)(\.) совпадает, заменой будет значение Group 1 + _old + Group 2. В противном случае это группа 3 + _old (просто добавляемая в конце).

person Wiktor Stribiżew    schedule 08.08.2020
comment
Большой! Спасибо, Виктор. - person Felipe Jiménez; 09.08.2020
comment
Извините, Виктор, в Octave почему-то работает: ›› regexprep ('my.file.ext', '^ (?: (. *) (\.) | (. *))', '$ 3 $ 1_old $ 2 ') ans = my.file_old.ext, но в Matlab (9.6.0.1072779 (R2019a)) этого не происходит: ›› regexprep (' my.file.ext ',' ^ (?: (. *) (\.) | (. *)) ',' $ 3 $ 1_old $ 2 ') ans =' $ 3 $ 1_old $ 2ext 'Есть идеи, почему? - person Felipe Jiménez; 09.08.2020
comment
@ FelipeJiménez Понятия не имею, почему, синтаксис замены такой же. - person Wiktor Stribiżew; 10.08.2020
comment
@ wiktor.stribizew Спасибо, я разместил Q в ответах MathWork на Matlab и приведу здесь свои отзывы, если вам интересно. - person Felipe Jiménez; 10.08.2020
comment
Вы можете увидеть ответ Уолтера Роберсона здесь: es.mathworks.com/matlabcentral/answers/ (Надеюсь, можно будет разместить там ссылку.) - person Felipe Jiménez; 10.08.2020
comment
@ FelipeJiménez Если объяснение верно, вы можете просто изменить группу без захвата на захватывающую и увеличить обратные ссылки, regexprep(filename, '^((.*)(\.)|(.*))', '$4$2_old$3') - person Wiktor Stribiżew; 11.08.2020
comment
Нет, объяснение кажется неправильным, поскольку ваша последняя команда снова работает в Octave, но не в Matlab (где результат - «$ 4 $ 2_old $ 3ext»). - person Felipe Jiménez; 11.08.2020

Если можно сделать это без регулярных выражений, вы можете использовать fileparts следующее:

filename  = 'my.file.ext';
suffix = '_old';
[p, n, e] = fileparts(filename); % path, file, extension; each possibly empty
result = [p, n, suffix, e];

примера в октаву.

person Luis Mendo    schedule 08.08.2020
comment
Спасибо, Луис, я знаю, что могу использовать файловые части, но хотел знать, как использовать regexprep. - person Felipe Jiménez; 09.08.2020
comment
Понятно. Рад, что ты нашел ответ! - person Luis Mendo; 09.08.2020