как убрать точки из имен файлов, кроме расширения файла - PullRequest
4 голосов
/ 20 июня 2009

У меня есть куча файлов, которые выглядят так:

A.File.With.Dots.Instead.Of.Spaces.Extension

Который я хочу преобразовать через регулярное выражение в:

A File With Dots Instead Of Spaces.Extension

Он должен быть в одном регулярном выражении (потому что я хочу использовать его с инструментом пакетного переименования Total Commander).

Помоги мне, гуру-регулярники, ты моя единственная надежда.

Редактировать

Несколько человек предложили двухэтапные решения. Два шага действительно делают эту проблему тривиальной, и я действительно надеялся найти одношаговое решение, которое будет работать в TC. Кстати, мне удалось найти одношаговое решение, которое работает, если в имени файла есть четное количество точек. Поэтому я все еще надеюсь на выражение серебряной пули (или доказательство / объяснение того, почему это абсолютно невозможно).

Ответы [ 6 ]

4 голосов
/ 20 июня 2009

Похоже, библиотека регулярных выражений Total Commander не поддерживает выражения обхода, поэтому вам, вероятно, придется заменять несколько точек одновременно, пока не останется точек. Заменить:

([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)$

с

$1 $2 $3.$4

(Повторите последовательность и количество обратных ссылок для большей эффективности. Вы можете поднять до 9 долларов, что может быть или не достаточно.)

Похоже, что в Total Commander не существует способа сделать это с одним определенным выражением, извините.

2 голосов
/ 20 июня 2009

В основном:

/\.(?=.*?\.)//

сделает это в терминах регулярных выражений. Это означает, что замените любой период, за которым следует строка символов (не жадных), а затем точка без нуля. Это позитивный прогноз .

В PHP это делается так:

$output = preg_replace('/\.(?=.*?\.)/', '', $input);

Другие языки различаются, но принцип тот же.

1 голос
/ 29 сентября 2011

Или замените все точки пробелом, затем замените [пробел] [Расширение] на. [Расширение]

A.File.With.Dots.Instead.Of.Spaces.Extension в Файл с точками вместо расширения пробелов в Файл с точками вместо пробелов. Расширение

1 голос
/ 20 июня 2009

Вот пример, основанный на вашем почти-решении:

/\.([^.]*(\.[^.]+$)?)/\1/

Это, грубо говоря, «любая точка, минус точка, и, возможно, плюс еще одна точка в конце линии». Я не мог точно сказать, хотите ли вы, чтобы точки были удалены или превращены в пробелы - если последнее, замените подстановку на "\ 1" (минус кавычки, конечно).

[Отредактировано, чтобы изменить + на *, как Хелен ниже.]

0 голосов
/ 07 января 2015

Другой способ найти все точки, кроме последнего в имени файла (windows), который я нашел, работает в Mass File Renamer:

(?!\.\w*$)\.

Я не знаю, насколько это полезно для других пользователей, но эта страница была ранним результатом поиска, и если бы она была здесь, она бы сэкономила мне время.

Исключает результат, если за ним следует непрерывная последовательность буквенно-цифровых символов, ведущих к концу ввода (имя файла), но в противном случае находит все вхождения символа точки.

0 голосов
/ 20 июня 2009

Вы можете сделать это с Lookahead. Однако я не знаю, какую поддержку регулярных выражений вы имеете.

/\.(?=.*\.)//

Что примерно соответствует Любой точке /\./, которая имеет что-то и точку после. Очевидно, что последняя точка - единственная, которая не соответствует. Я опускаю «опциональность» чего-то между точками, потому что данные выглядят так, как будто что-то всегда будет между ними, а «опциональность» снижает производительность.

Проверка: http://www.regular -expressions.info / lookaround.html

...