View previous topic :: View next topic |
Как часто вы пользуетесь регулярными выражениями (RegEx)? |
Раз в день |
|
34% |
[ 36 ] |
Раз в неделю |
|
18% |
[ 19 ] |
Раз в месяц |
|
27% |
[ 28 ] |
А что это такое? |
|
19% |
[ 20 ] |
|
Total Votes : 103 |
|
Author |
Message |
likhobory
Joined: 25 Feb 2009 Posts: 63 Location: Москва
|
(Separately) Posted: Mon May 23, 2022 23:40 Post subject: |
|
|
Не программист, но любитель. Из опыта - чем проще регулярка, тем большего количества грабель можно избежать. В Вашем случае я бы предложил следующий PS-скрипт, в одной команде сначала удаляющий неалфавитные символы, а затем выполняющий необходимые замены:
Code: | ls $args[0] -Recurse|Rename-Item -NewName { $_.Name -replace '^\w\s' -replace '\s*-\s*|_', ' ' } |
Last edited by likhobory on Tue May 24, 2022 20:04; edited 1 time in total |
|
Back to top |
|
 |
Monarch-LFV

Joined: 22 Jul 2019 Posts: 327
|
(Separately) Posted: Tue May 24, 2022 04:33 Post subject: |
|
|
rexen
Удаляет образующиеся двойные пробелы (например, в сочетании " - "), но если в имени изначально были двойные пробелы, то не удалит.
А вообще, согласен с предыдущим оратором - если требуется много операций/хотелок/проходов, то проще скрипт сделать с несколькими строками по последовательным заменам. Только тогда получится сделать что-то адекватное. |
|
Back to top |
|
 |
sa
Joined: 29 Apr 2009 Posts: 2693
|
(Separately) Posted: Tue May 24, 2022 10:56 Post subject: |
|
|
rexen wrote: | удаляет все пробелы подчистую |
Да, поторопился: ошибочно принял удаление всех пробелов за ожидаемое мной – только задвоенных (а одиночных в моём примере не было).
Если говорить о нескольких проходах, то, начиная с версии TC 10.50, их можно выполнить одной кнопкой без каких-либо дополнительных нажатий. Например, использовать связку команд наподобие такой:
cm_SelectAllFiles,em_ren_1,cm_wait 0,cm_SelectAllFiles,em_ren_2
Здесь пользовательские команды (em_) имеют вид MULTIRENAME==имя_шаблона. |
|
Back to top |
|
 |
Monarch-LFV

Joined: 22 Jul 2019 Posts: 327
|
(Separately) Posted: Tue May 24, 2022 11:41 Post subject: |
|
|
rexen
Чтоб не оффтопить здесь, разместил в этой ветке скрипт VBS по вашим хотелкам. |
|
Back to top |
|
 |
rexen
Joined: 29 Mar 2018 Posts: 10
|
(Separately) Posted: Sat Dec 16, 2023 20:24 Post subject: |
|
|
Народ, кстати, "ЧатГопота" МОЖЕТ!
Решил сиё поделие OpenAI помучать моим вопросом - ну так он сразу мне почти идеальный регэксп выдал:
(там после плюса в конце ещё пробел обязателен - его почему-то не видно)
Я только внёс кириллицу в множество и Ё - ChatGPT проигнорил наш алфавит (культура отмены, штоль.. )
в диалоге Тотала группового переименования - в поле "заменить" на один пробел
В итоге оно справляется и с образующимися дублями пробелов, но... кроме случая когда НЕнужный символ в самом конце строки - он его меняет на пробел и там и оставляет, хотя в идеале финализирующий пробел в имени файла - лишний.
Так что велкам: https://chat.openai.com/
(да, там целая проблема с доступом к сервису из наших "палестин", но решения есть - ищите и обрящете) |
|
Back to top |
|
 |
Rainbow-Spike

Joined: 09 Mar 2019 Posts: 9 Location: Амурская область, Циолковский
|
(Separately) Posted: Mon Sep 30, 2024 08:48 Post subject: Вариатор внутри регулярки |
|
|
Есть немного отличающиеся шаблоны для сжатия имён протоколов совещаний трёх типов
Протокол.+ № ?(\d+)-пр\.? от (\d+\.\d+\.\d+)( г\.)? Протокол оперативного совещания( от \d+\.\d+\.\d+( г\.)?)?
$2 ПрОС-$1
Протокол.+ № ?(\d+)-пр\.? от (\d+\.\d+\.\d+)( г\.)? Протокол служебного совещания( от \d+\.\d+\.\d+( г\.)?)?
$2 ПрСС-$1
Протокол.+ № ?(\d+)-пр\.? от (\d+\.\d+\.\d+)( г\.)? Протокол технического совещания( от \d+\.\d+\.\d+( ?г\.)?)?
$2 ПрТС-$1
А затем появилось обычное совещание
Протокол.+ № ?(\d+)-пр\.? от (\d+\.\d+\.\d+)( г\.)? Протокол совещания( от \d+\.\d+\.\d+( г\.)?)?
$2 ПрС-$1
Возможно ли как-то слить все эти шаблоны в один с условием, определяющим вставку буквы? _________________ * Руководитель интернационального онлайн-переводчика "Комикслейт"
* Инженер-эколог космодрома "Восточный"
* Фиолетовый дракон-гетеросексуал |
|
Back to top |
|
 |
Monarch-LFV

Joined: 22 Jul 2019 Posts: 327
|
(Separately) Posted: Mon Sep 30, 2024 15:26 Post subject: |
|
|
Rainbow-Spike
Не совсем понятна постановка задачи, приведите примеры начального вида и того, что нужно получить. Судя, например, по вашей первой записи вижу для себя такой пример:
Code: | Протокол ffff № 225-пр. от 30.09.2024 г. Протокол оперативного совещания от 30.09.2024 г |
Смущает, что в названии 2 раза "Протокол" и дата, так и должно быть?
Добавлено спустя 9 минут:
Пока выстраивается такой вариант:
Code: | .*?№ ?(\d+).*?от ([\d+\.]+).*?Протокол (.)?.*?совещания.*
$2 Пр\U$3С-$1 |
Так? |
|
Back to top |
|
 |
Rainbow-Spike

Joined: 09 Mar 2019 Posts: 9 Location: Амурская область, Циолковский
|
(Separately) Posted: Fri Oct 04, 2024 12:31 Post subject: |
|
|
да, там был протокол протокола
спасибо, регулярка работает. про флаг \U не знал...
а есть ли возможность вставлять на выбор в зависимости от стриггеренной группы в регекспе? ну то есть аналог функции if then else
перловские регекспы такое умеют, а может ли уметь ТК? _________________ * Руководитель интернационального онлайн-переводчика "Комикслейт"
* Инженер-эколог космодрома "Восточный"
* Фиолетовый дракон-гетеросексуал |
|
Back to top |
|
 |
Monarch-LFV

Joined: 22 Jul 2019 Posts: 327
|
(Separately) Posted: Fri Oct 04, 2024 13:09 Post subject: |
|
|
Rainbow-Spike
Нет, TC не поддерживает при переименовании условия. Это нужно писать скрипт, например на VBS. А чем вас не устраивает предложенный мной вариант? Имя формируется по первой букве. |
|
Back to top |
|
 |
Rainbow-Spike

Joined: 09 Mar 2019 Posts: 9 Location: Амурская область, Циолковский
|
(Separately) Posted: Sat Oct 05, 2024 20:15 Post subject: |
|
|
Устраивает, я просто про запас спросил, для экономии размера списка шаблонов. Жаль, что условия не поддерживаются _________________ * Руководитель интернационального онлайн-переводчика "Комикслейт"
* Инженер-эколог космодрома "Восточный"
* Фиолетовый дракон-гетеросексуал |
|
Back to top |
|
 |
rexen
Joined: 29 Mar 2018 Posts: 10
|
(Separately) Posted: Mon Nov 04, 2024 22:17 Post subject: |
|
|
Нигде не могу найти чёткое и внятное пояснение, какой всё-таки стандарт регулярок реализован в TRegExpr. Упрощённый POSIX? Где наиболее полная справка по поддерживаемым выражениям?
Ни во встроенной справке Тотала, ни на сайте Гхислера: https://www.ghisler.ch/wiki/index.php/Regular_Expressions не упоминаются "просмотры вперёд или назад". Хотя по факту инструмент группового переименования как-то их воспринимает в конструкции выражения.
На сайте Сорокина, автора библиотеки, лежащей в основе работы Тотала с регулярками, заявлена полноценная работа и с lookahead assertion и с lookbehind assertion: https://regex.sorokin.engineer/ru/regular_expressions/#assertions-lookahead-lookahead
- а это уже не POSIX, а PCRE, если я не ошибаюсь. |
|
Back to top |
|
 |
Avada

Joined: 01 Aug 2008 Posts: 10417 Location: Россия, Саратов
|
(Separately) Posted: Mon Nov 04, 2024 22:45 Post subject: |
|
|
rexen wrote: | не упоминаются "просмотры вперёд или назад" |
Упоминаются — и уже достаточно давно (TC 10.00). Откройте в английской справке раздел по регуляркам и поищите по словам Look ahead/behind. На русский тоже переведено давно, но пока обновлённая справка не вышла. _________________ Даже самая богатая фантазия
Не представит себе наши безобразия. |
|
Back to top |
|
 |
Batya

Joined: 15 Dec 2004 Posts: 2226 Location: Москва, Россия
|
(Separately) Posted: Tue Jul 01, 2025 19:49 Post subject: |
|
|
Приветствую!
Давно не возился с регулярными выражениями. Но возникла необходимость разобраться с именованными группами. Пока не получается. Помогите выделить число из текста, содержащего разделители групп разрядов, в группу с именем.
Например, из строк "1,234,567" или "1 234 567" нужно выделить значение "1234567". При этом количество символов в числе переменное.
Есть рабочий шаблон "(?<VALUE>\d+([\.\s,]\d{3})*)", но он возвращает значение, включая разделители групп разрядов. А как без них?
Попробовал "(?<VALUE>\d+((?:[\.\s,])\d{3})*)", но что-то не работает
Помогите, пожалуйста, у кого рука на это уже набита. _________________ Нет, я не сплю. Я просто медленно моргаю. |
|
Back to top |
|
 |
Monarch-LFV

Joined: 22 Jul 2019 Posts: 327
|
(Separately) Posted: Wed Jul 02, 2025 01:02 Post subject: |
|
|
Batya
Если это в простом текстовом редакторе, то тут без цикла, а без цикла только так:
Code: | (<Value>\d+)([\.,\s ])?(\d{3})*\2?(\d{3})*\2?(\d{3})*\2?(\d{3})*\2?(\d{3})*\2?(\d{3})*\2?(\d{3})*\2?(\d{3})*\2?(\d{3})* |
То есть, для каждой группы разрядов выделяем свою подгруппу, в замене так:
Code: | \1\3\4\5\6\7\8\9\10\11 |
Вторая подгруппа отдана для определения разделителя, поэтому пропущена, чтобы в других местах был однозначно такой же.
И еще нюанс, бывает, в качестве разделителя разрядов ставят неразрывный пробел (Alt+160), форум этот символ не передает, поэтому во второй группе вместо пробела нужно поставить неразрывный пробел, а точку бы убрал, так как это уже разделитель дробной части (для англ.): ([,\s ]) |
|
Back to top |
|
 |
Batya

Joined: 15 Dec 2004 Posts: 2226 Location: Москва, Россия
|
(Separately) Posted: Wed Jul 02, 2025 01:59 Post subject: |
|
|
Monarch-LFV
Не то. Нюанс именно в именованных группах. Нужно получить значение для <VALUE>. _________________ Нет, я не сплю. Я просто медленно моргаю. |
|
Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|