Я использую утилиту переименования файлов Total Commander, и имена файлов содержат даты, например
May/04/2021
Я хочу нормализовать даты и сделать их сортируемыми, отформатировав их как YYYY-MM-DD
, поэтому используйте следующее регулярное выражение:
(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)/(\d\d?)/((\d\d)?(\d\d))
#\1 \2 \3 \4 \5 \6 \7 \8 \9 \10 \11 \12 <--- index of matched capture group text
# possible alternative regex:
((Jan)|(Feb)|(Mar)|(Apr)|(May)|(Jun)|(Jul)|(Aug)|(Sep)|(Oct)|(Nov)|(Dec))/(\d\d?)/((\d\d)?(\d\d))
В строке замены вместо использования фактического захваченного текста в группе (в данном случае May
) я хочу заменить его порядковым номером захваченного текста внутри группы, который в данном случае будет 5
, так что окончательный результат будет:
2021-05-04
00
вместо просто 0
?(Я подозреваю, что сценарий может быть единственным способом сделать это, но если есть какой-то специальный синтаксис регулярных выражений, о котором я не знаю, я хотел бы это выяснить).
(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)
— это всего лишь одна группа захвата. Если вам нужно 12 групп захвата, вам нужно заключить каждую альтернативу в круглые скобки: (Jan)|(Feb)|(Mar)|...
На языке сценариев это будет намного проще. У них есть библиотеки анализа дат, вы также можете использовать ассоциативный массив для сопоставления названий месяцев с числами и т. д.
Согласен с Бармаром: вместо манипуляций со строками анализируйте дату в формате MMM-DD-YYYY
, а затем визуализируйте ее в формате YYYY-MM-DD
.
@PerdiEstaquel Я не совсем понимаю то, что вы предлагаете.
@Бармар, я понимаю, что ты имеешь в виду, но твое предложение - это просто еще один способ съемки. В конечном итоге все сводится к следующему: есть ли способ использовать map
или условный if
в регулярном выражении... может быть, пора снова смахнуть пыль с моей книги по регулярным выражениям... и да, я полностью осознаю, что у меня теперь две проблемы ;)
@Bohemian Я не могу, это просто регулярное выражение в Total Commander для переименования файлов, поэтому мне было интересно, есть ли что-нибудь встроенное в механизм регулярных выражений, которое может это сделать.... это было бы одно из наиболее эзотерических случаи использования регулярных выражений, наверняка....
Перди имеет в виду использование регулярного выражения для замены каждого месяца, например. /from/to/
. Понятия не имею, поддерживает ли Total Commander это в своей реализации регулярных выражений.
Я бы вообще не использовал регулярное выражение. Преобразуйте каждую строку в объект даты, используя строку формата (например, в C, где она родилась, и других языках, '%b/%d/%Y'
вместо 'May/04/2021'
. Если у вас есть объект даты, его легко отформатировать по желанию с помощью другой строки формата (например, , '%Y-%m-%d'
для '2021-05-04'
). Конечно, может потребоваться некоторая предварительная обработка, если даты не всегда выражаются в одном и том же формате (например, 'May/04/2021'
в одном месте и 'Sep/18/22'
в другом).
В общем, поиск/замена регулярных выражений может просто выполнять буквальное копирование. Вы можете изменить порядок вещей, используя обратные ссылки в строке замены, но для выполнения подобных преобразований не существует вычислений.
Я только что сделал замену поиска для каждого месяца:
не то чтобы я в курсе, но тебе всего 12, и ты всегда можешь сделать /01 января/, /02 февраля/, ...