Выделить повторяющееся слово в строчке со словами через _, используя regex
Есть строка proba_m4050_434_3g3_3g3.png
Хотелось бы подобрать регулярное выражение, чтобы выделить последнее _3g3 и заменить на пустоту (proba_m4050_434_3g3.png).
Проблема в том, что таких строк много (поэтому пробую пакетное переименование), части навроде 3g3 могут состоять не всегда из трёх символов, а в некоторых файлов и вовсе нет дублирующей части, то есть они сразу выглядит так, как мне нужно.
Все файлы начинаются с proba_m, части отделяются нижним подчеркиванием.
В тех ответах, что находил ранее, выражение рассматривало строчку, где слова отделяются пробелом, что не мой случай.
Пример ожидаемого преобразования
Было:
proba_m4050_434_3g3_3g3.png
proba_m313_313.png
proba_m5214_2520_gb54_gb54.png
proba_m141_18d5_fd071_fd071.png
proba_m312_534_430_39g.png
proba_m3501_5721.png
Стало:
proba_m4050_434_3g3.png
proba_m313.png
proba_m5214_2520_gb54.png
proba_m141_18d5_fd071.png
proba_m312_534_430_39g.png (нет дублирования, без изменений)
proba_m3501_5721.png (нет дублирования, без изменений)
Ответы (1 шт):
Нужно использовать обратные ссылки (backreferences).
Само регулярное выражение получается тривиальным:
(_\w+)\1+
Квантификатор + в конце позволяет находить не только две повторяющиеся последовательности, а любое их количество. Если принципиально только две, то + можно убрать.
Замену производим не на пустую строку, а на захваченную группу.
Чтобы ограничить поиск только в конце наименования (перед расширением), нужно дополнить выражение:
(_\w+)\1+\.
Замена производится на захваченную группу с точкой $1.