#regex #string #date #notepad
Вопрос:
Мне нужно изменить формат даты многих значений в файле SQL.
Есть значения дат, которые находятся в формате «DD-MON-RR», но мне нужно, чтобы они были в формате «ГГГГ-ММ-ДД».
В файле у меня есть даты 21-го и 20-го веков:
to_date('01-Nov-20','DD-MON-RR'),to_date('28-Dec-99','DD-MON-RR')
Я ищу регулярное выражение, чтобы найти и заменить эти значения.
Это была моя первая попытка, работает даже с 20-го века:
FIND: (d{2})-(w{3})-(([0-4])d|[5-9]d) REPLACE: (?{4}20:19)3-2-1
Это помогает изменить порядок расположения элементов, но я должен заменить все месяцы соответствующими числами.
Теперь я ищу что-то, чтобы найти и заменить названия месяцев в одном и том же регулярном выражении:
FIND: (d{2})-((Jan)|(Feb)|(Mar)|(Apr)|(May)|(Jun)|(Jul)|(Aug)|(Sep)|(Oct)|(Nov)|(Dec))-(([0-4])d|[5-9]d)
Теперь у меня возникли проблемы с написанием выражения замены, кто-нибудь может мне помочь?
Спасибо
Ответ №1:
Вы можете определить как можно больше месяцев (сокращений месяцев) вместо (w{3})
и использовать немного больше условий в шаблоне условной замены.
Вы можете использовать
Найти Что: (d{2})-(?:(Jan)|(Feb)|(Mar)|(Apr)|(May)|(Jun)|(Jul)|(Aug)|(Sep)|(Oct)|(Nov)|(Dec))-(([0-4])d|[5-9]d)
Заменить На: (?{15}20:19)$14-(?{13}12:?{12}11:?{11}10:?{10}09:?{9}08:?{8}07:?{7}06:?{6}05:?{5}04:?{4}03:?{3}02:?{2}01)-$1
Смотрите демонстрационный скриншот:
Таким (w{3})
(?:(Jan)|(Feb)|(Mar)|(Apr)|(May)|(Jun)|(Jul)|(Aug)|(Sep)|(Oct)|(Nov)|(Dec))
образом, заменяется группой без захвата с 12 группами захвата. Вы можете отредактировать его, скажем, чтобы также поддержать Sept
, добавить t?
после Sep
или добавить e?
после Jun
, чтобы также поддержать June
.
Схема замены корректируется с учетом вновь введенных 12 групп захвата.
Комментарии:
1. Почему не одна группа захвата, такая как
(Jan|Feb|Mar|…)
?2. @knittl Потому что каждая группа месяцев должна быть отдельно проверена на соответствие, иначе вы не сможете использовать шаблон условной замены.
3. Я понимаю. Спасибо. Я никогда не использовал условные замены в NP