К ТСКВ: примеры регулярных выражений

Обсуждение Total Commander. Установка, использование, настройка, решение проблем, скрытые функции. Обсуждение новых версий.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

Как часто вы пользуетесь регулярными выражениями (RegEx)?

Раз в день
36
34%
Раз в неделю
20
19%
Раз в месяц
29
27%
А что это такое?
21
20%
 
Всего голосов: 106

Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

zoog
1. В справочном примере только два подвыражения меняются местами (причём с указанием расширения), так что ваше "простое действие" не оттуда.
2. Вопрос надо формулировать не с "типа", а точно. Каких полей не бывает? Третьего и/или четвёртого? Правильно ли я понял, что при любом варианте должны остаться только первые два поля с начала, переставленные местами и разделённые одним пробелом? Или нет? (Кстати, для переменного числа полей ваше выражение в любом случае не годилось бы уже потому, что все чёрточки за пределами скобок указаны как реальные символы в точном количестве три штуки.)
2. Для обсуждения регулярных выражений на форуме есть общие темы, и создание новых тем по каждому частному вопросу — явно не самая хорошая идея. Перенесено по принадлежности.
Даже самая богатая фантазия
Не представит себе наши безобразия.
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

zoog
Можно так попробовать искать, если задвоенный пробел в результате не смущает:
([^-]*) - ([^-]*)(.*)
От задвоения можно избавиться, добавив пробел после маски файла [N] и в выражении для поиска, перед (.*).
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

sa
Да, с указанными поправками работает. (Если, как было сказано выше, техзадание понято правильно.)
Упомяну также для ясности про указание $2 $1 в поле "Заменить на", включение опции "Рег. выраж." и выключение опции [E].
Даже самая богатая фантазия
Не представит себе наши безобразия.
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

Avada писал(а):с указанными поправками работает.
К сожалению, не в случае, когда в полях "автор" и/или "год" присутствует тире…
Тут, как вариант, потребуется предварительный проход переименования с заменой тире в разделителе полей (пробел-тире-пробел) на какой-нибудь экзотический символ, которого заведомо нет в содержимом первых двух полей и правка выражения для поиска с заменой (в трёх местах) тире на этот символ.
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

sa
Да, но в случае редких исключений можно и выполнить точечную правку. Кроме того, всё-таки в обсуждаемом виде это не тире, а дефис (чёрточка, минус, -). А тире бывает короткое (–) и длинное (—).
Даже самая богатая фантазия
Не представит себе наши безобразия.
zoog
Сообщения: 7
Зарегистрирован: Вт ноя 20, 2012 16:49

Сообщение zoog »

Avada, пардон что не отвечал - уведомления не сработали, видимо.
1) А какая разница, сколько полей? Всё, что больше 1го - логически монопенисуально, не? Если б нумерация шла с 1го - всё б у меня получилось.
2) У нас есть 3-4-возможно более полей (мне интересно решить общий случай), поменять первые 2-3, гарантированно присутствующие.
для переменного числа полей ваше выражение в любом случае не годилось бы уже потому, что все чёрточки за пределами скобок указаны как реальные символы в точном количестве три штуки.
Не понял(( если реальное число полей меньше, чем в моём выражении - всё сломается, имеете в виду.
2) Не разобрался сразу, спасибо за перенос.
sa писал(а): Можно так попробовать искать, если задвоенный пробел в результате не смущает:
([^-]*) - ([^-]*)(.*)
Так, мы заменяем (всё, что угодно) на (любую последовательность символов без тире) - это типа упрощает логику поиска?
Спасибо)
Работает. Так проблема была не в том, что группы искались с конца имени?
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

zoog
Не только в полях дело, а ещё и в чёрточках-разделителях между скобками, которых при вашей форме записи можно найти ровно столько, сколько было указано, а если их по факту меньше/больше, наперекосяк идёт вся операция. А что счёт подвыражений для поиска-замены (при правильном синтаксисе, естественно) идёт именно с начала, сказано в справке TC.
Поскольку рабочее решение вашей задачи дано, то обсуждать тут дальше, кто что имел в виду, особого смысла не вижу. Если очень интересно — читайте справку и экспериментируйте самостоятельно.
Даже самая богатая фантазия
Не представит себе наши безобразия.
zoog
Сообщения: 7
Зарегистрирован: Вт ноя 20, 2012 16:49

Сообщение zoog »

Avada,
которых при вашей форме записи можно найти ровно столько, сколько было указано
Ну да, найти столько, остальные игнорировать. Разве не так программирование / обработка ошибок работает?)
А что счёт подвыражений для поиска-замены (при правильном синтаксисе, естественно) идёт именно с начала, сказано в справке TC.
Счёт (порядок счёта) идёт с первого, но само первое поле (при числе полей, бОльшем указанного) выбирается не с начала, то есть при 3х полях в условии и 5 полях на входе считается не $1 $2 $3**, a **$1 $2 $3.
Ещё раз спасибо за помощь.
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

Ваша исходная запись означала подвыражения для поиска-замены, разделённые ровно тремя безусловно присутcтвующими чёрточками, обрамлёнными пробелами. Поэтому никакое "остальные игнорировать" тут не прокатывает: часть имён просто не находится или интерпретируется неверно. Правильный синтаксис с упаковкой всего нужного в скобки был дан позже (со всеми уточнениями), и вот там действительно учитываются только первые два подвыражения (они меняются местами с убиранием лишних разделителей), а вся следующая часть имени игнорируется (ибо $3 для замены не указано).
Даже самая богатая фантазия
Не представит себе наши безобразия.
zoog
Сообщения: 7
Зарегистрирован: Вт ноя 20, 2012 16:49

Сообщение zoog »

Дошло. Нужно было дополнить (.*) - тогда обрабатывались бы лишь первые поля?
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

zoog
Не только это, надо ещё нормально границы подвыражений указать и все пробелы соблюсти. Синтаксис правильного варианта проанализируйте как следует (к вашим услугам справочный раздел по регуляркам и материалы форума). В частности, ([^-]*) означает 0 или более любых символов, кроме чёрточки, а (.*) — 0 или более каких угодно символов. А чёрточка вне скобок стоит в единственном месте, где её действительно следовало указать. Дальше, если нужно, разбирайтесь самостоятельно.
Даже самая богатая фантазия
Не представит себе наши безобразия.
zoog
Сообщения: 7
Зарегистрирован: Вт ноя 20, 2012 16:49

Сообщение zoog »

В частности, ([^-]*) означает 0 или более любых символов, кроме чёрточки, а (.*) — 0 или более каких угодно символов.
Ну да, в данном случае как раз последующие чёрточки нельзя учитывать. Только первые (поля).
rexen
Сообщения: 10
Зарегистрирован: Чт мар 29, 2018 17:12

Сообщение rexen »

Камрады, прошу помощи.
Рядовая проблема с очисткой имён файлов (скачиваемых роликов) от всякого мусора и лишних символов.
Меня устраивает простое регулярное выражение, удаляющее всё кроме букв и цифр:

Код: Выделить всё

[^\wА-Яа-яёЁ ]
^ - "кроме"
\w - латинские цифробуквы
А-Яа-яёЁ - кирилица
(пробелы оставляем)

НО!

После удаления, скажем, дефиса, обрамляющие его пробелы остаются - т.е. получается задваивание пробелов.
И я уже всю голову поломал и всякие варианты поперебирал, но не могу никак придумать, как это задваивание (затраивание...) удалять этим же проходом. Вот пройтись вторым разом по тем же файлам и отдельным выражением убрать все повторяющиеся пробелы - не проблема. А вот за один проход - подозреваю, никак. Или?
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

rexen
Так не сработает?

Код: Выделить всё

[^\wА-Яа-яёЁ ]|[  ]
rexen
Сообщения: 10
Зарегистрирован: Чт мар 29, 2018 17:12

Сообщение rexen »

sa, нет, Ваша регулярка удаляет все пробелы подчистую.
:|
Я так задавать "двойной пробел" пробовал самыми разными способами.
Тут, видимо, причина не в том, чтобы извернуться и выдумать некое неординарное регулярное выражение, а в самом принципе, который никак кроме в 2 шага не реализовать:

1) УДАЛИТЬ все неалфавитные символы
2) ЗАМЕНИТЬ множественные пробелы ОДНИМ пробелом

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

---

Разве что напихать некий массив-перечисление всевозможных комбинаций пробельных/неалфавитных символов с ЗАМЕНОЙ любой из них на один пробел. Но уж больно некрасивый выход, да и число комбинаций слишком большое - придётся оставлять только самые очевидные.

Потренироваться можно на вот таком примере:

Код: Выделить всё

01.  PODcast - прямой_эфир. Отвечаем , вопросы, комментарии (@17`05'2022).m4a
(здесь, кстати, по логике ещё и подчёркивание (и прочие разделяющие слова непробельные символы) надо бы пробелом заменить)
Ответить