Есть ли способ использовать индекс группы захвата в качестве замены в регулярном выражении?

Я использую утилиту переименования файлов 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
  1. Есть ли способ получить доступ/использовать индекс захваченного текста в группе захвата, а не только захваченный текст?
  2. И есть ли способ отформатировать его как 00 вместо просто 0?

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

не то чтобы я в курсе, но тебе всего 12, и ты всегда можешь сделать /01 января/, /02 февраля/, ...

Perdi Estaquel 09.05.2024 02:03
(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) — это всего лишь одна группа захвата. Если вам нужно 12 групп захвата, вам нужно заключить каждую альтернативу в круглые скобки: (Jan)|(Feb)|(Mar)|...
Barmar 09.05.2024 02:04

На языке сценариев это будет намного проще. У них есть библиотеки анализа дат, вы также можете использовать ассоциативный массив для сопоставления названий месяцев с числами и т. д.

Barmar 09.05.2024 02:07

Согласен с Бармаром: вместо манипуляций со строками анализируйте дату в формате MMM-DD-YYYY, а затем визуализируйте ее в формате YYYY-MM-DD.

Bohemian 09.05.2024 02:26

@PerdiEstaquel Я не совсем понимаю то, что вы предлагаете.

skeetastax 09.05.2024 02:46

@Бармар, я понимаю, что ты имеешь в виду, но твое предложение - это просто еще один способ съемки. В конечном итоге все сводится к следующему: есть ли способ использовать map или условный if в регулярном выражении... может быть, пора снова смахнуть пыль с моей книги по регулярным выражениям... и да, я полностью осознаю, что у меня теперь две проблемы ;)

skeetastax 09.05.2024 02:49

@Bohemian Я не могу, это просто регулярное выражение в Total Commander для переименования файлов, поэтому мне было интересно, есть ли что-нибудь встроенное в механизм регулярных выражений, которое может это сделать.... это было бы одно из наиболее эзотерических случаи использования регулярных выражений, наверняка....

skeetastax 09.05.2024 02:50

Перди имеет в виду использование регулярного выражения для замены каждого месяца, например. /from/to/. Понятия не имею, поддерживает ли Total Commander это в своей реализации регулярных выражений.

l3l_aze 09.05.2024 04:26

Я бы вообще не использовал регулярное выражение. Преобразуйте каждую строку в объект даты, используя строку формата (например, в C, где она родилась, и других языках, '%b/%d/%Y' вместо 'May/04/2021'. Если у вас есть объект даты, его легко отформатировать по желанию с помощью другой строки формата (например, , '%Y-%m-%d' для '2021-05-04'). Конечно, может потребоваться некоторая предварительная обработка, если даты не всегда выражаются в одном и том же формате (например, 'May/04/2021' в одном месте и 'Sep/18/22' в другом).

Cary Swoveland 09.05.2024 08:44
Total Commander использует бесплатную библиотеку Delphi TRegExpr Андрея Сорокина. Так что ни в коем случае, он не поддерживает условную замену. Вам потребуется проводить 12 замен каждый месяц. Или просто напишите сценарий PowerShell, чтобы выполнить замену по мере необходимости.
Wiktor Stribiżew 09.05.2024 09:02

В общем, поиск/замена регулярных выражений может просто выполнять буквальное копирование. Вы можете изменить порядок вещей, используя обратные ссылки в строке замены, но для выполнения подобных преобразований не существует вычислений.

Barmar 09.05.2024 16:55
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
12
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я только что сделал замену поиска для каждого месяца:

Другие вопросы по теме