Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

К ТСКВ: примеры регулярных выражений
Goto page Previous  1, 2, 3 ... , 10, 11, 12  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Общие вопросы printer-friendly view
View previous topic :: View next topic  

Как часто вы пользуетесь регулярными выражениями (RegEx)?
Раз в день
33%
 33%  [ 34 ]
Раз в неделю
18%
 18%  [ 19 ]
Раз в месяц
27%
 27%  [ 28 ]
А что это такое?
19%
 19%  [ 20 ]
Total Votes : 101

Author Message
Avada



Joined: 01 Aug 2008
Posts: 10252
Location: Россия, Саратов

Post (Separately) Posted: Sat Jan 22, 2022 19:53    Post subject: Reply with quote

zoog
1. В справочном примере только два подвыражения меняются местами (причём с указанием расширения), так что ваше "простое действие" не оттуда.
2. Вопрос надо формулировать не с "типа", а точно. Каких полей не бывает? Третьего и/или четвёртого? Правильно ли я понял, что при любом варианте должны остаться только первые два поля с начала, переставленные местами и разделённые одним пробелом? Или нет? (Кстати, для переменного числа полей ваше выражение в любом случае не годилось бы уже потому, что все чёрточки за пределами скобок указаны как реальные символы в точном количестве три штуки.)
2. Для обсуждения регулярных выражений на форуме есть общие темы, и создание новых тем по каждому частному вопросу — явно не самая хорошая идея. Перенесено по принадлежности.
_________________
Даже самая богатая фантазия
Не представит себе наши безобразия.
Back to top
View user's profile Send private message
sa



Joined: 29 Apr 2009
Posts: 2567

Post (Separately) Posted: Sat Jan 22, 2022 20:14    Post subject: Reply with quote

zoog
Можно так попробовать искать, если задвоенный пробел в результате не смущает:
([^-]*) - ([^-]*)(.*)
От задвоения можно избавиться, добавив пробел после маски файла [N] и в выражении для поиска, перед (.*).
Back to top
View user's profile Send private message
Avada



Joined: 01 Aug 2008
Posts: 10252
Location: Россия, Саратов

Post (Separately) Posted: Sun Jan 23, 2022 09:30    Post subject: Reply with quote

sa
Да, с указанными поправками работает. (Если, как было сказано выше, техзадание понято правильно.)
Упомяну также для ясности про указание $2 $1 в поле "Заменить на", включение опции "Рег. выраж." и выключение опции [E].
_________________
Даже самая богатая фантазия
Не представит себе наши безобразия.
Back to top
View user's profile Send private message
sa



Joined: 29 Apr 2009
Posts: 2567

Post (Separately) Posted: Sun Jan 23, 2022 11:03    Post subject: Reply with quote

Avada wrote:
с указанными поправками работает.

К сожалению, не в случае, когда в полях "автор" и/или "год" присутствует тире…
Тут, как вариант, потребуется предварительный проход переименования с заменой тире в разделителе полей (пробел-тире-пробел) на какой-нибудь экзотический символ, которого заведомо нет в содержимом первых двух полей и правка выражения для поиска с заменой (в трёх местах) тире на этот символ.
Back to top
View user's profile Send private message
Avada



Joined: 01 Aug 2008
Posts: 10252
Location: Россия, Саратов

Post (Separately) Posted: Sun Jan 23, 2022 17:51    Post subject: Reply with quote

sa
Да, но в случае редких исключений можно и выполнить точечную правку. Кроме того, всё-таки в обсуждаемом виде это не тире, а дефис (чёрточка, минус, -). А тире бывает короткое (–) и длинное (—).
_________________
Даже самая богатая фантазия
Не представит себе наши безобразия.
Back to top
View user's profile Send private message
zoog



Joined: 20 Nov 2012
Posts: 7

Post (Separately) Posted: Wed Jan 26, 2022 00:32    Post subject: Reply with quote

Avada, пардон что не отвечал - уведомления не сработали, видимо.
1) А какая разница, сколько полей? Всё, что больше 1го - логически монопенисуально, не? Если б нумерация шла с 1го - всё б у меня получилось.
2) У нас есть 3-4-возможно более полей (мне интересно решить общий случай), поменять первые 2-3, гарантированно присутствующие.
Quote:
для переменного числа полей ваше выражение в любом случае не годилось бы уже потому, что все чёрточки за пределами скобок указаны как реальные символы в точном количестве три штуки.

Не понял(( если реальное число полей меньше, чем в моём выражении - всё сломается, имеете в виду.
2) Не разобрался сразу, спасибо за перенос.

sa wrote:

Можно так попробовать искать, если задвоенный пробел в результате не смущает:
([^-]*) - ([^-]*)(.*)

Так, мы заменяем (всё, что угодно) на (любую последовательность символов без тире) - это типа упрощает логику поиска?
Спасибо)
Работает. Так проблема была не в том, что группы искались с конца имени?
Back to top
View user's profile Send private message
Avada



Joined: 01 Aug 2008
Posts: 10252
Location: Россия, Саратов

Post (Separately) Posted: Wed Jan 26, 2022 11:15    Post subject: Reply with quote

zoog
Не только в полях дело, а ещё и в чёрточках-разделителях между скобками, которых при вашей форме записи можно найти ровно столько, сколько было указано, а если их по факту меньше/больше, наперекосяк идёт вся операция. А что счёт подвыражений для поиска-замены (при правильном синтаксисе, естественно) идёт именно с начала, сказано в справке TC.
Поскольку рабочее решение вашей задачи дано, то обсуждать тут дальше, кто что имел в виду, особого смысла не вижу. Если очень интересно — читайте справку и экспериментируйте самостоятельно.
_________________
Даже самая богатая фантазия
Не представит себе наши безобразия.
Back to top
View user's profile Send private message
zoog



Joined: 20 Nov 2012
Posts: 7

Post (Separately) Posted: Wed Jan 26, 2022 15:08    Post subject: Reply with quote

Avada,
Quote:
которых при вашей форме записи можно найти ровно столько, сколько было указано

Ну да, найти столько, остальные игнорировать. Разве не так программирование / обработка ошибок работает?)
Quote:
А что счёт подвыражений для поиска-замены (при правильном синтаксисе, естественно) идёт именно с начала, сказано в справке TC.

Счёт (порядок счёта) идёт с первого, но само первое поле (при числе полей, бОльшем указанного) выбирается не с начала, то есть при 3х полях в условии и 5 полях на входе считается не $1 $2 $3**, a **$1 $2 $3.
Ещё раз спасибо за помощь.
Back to top
View user's profile Send private message
Avada



Joined: 01 Aug 2008
Posts: 10252
Location: Россия, Саратов

Post (Separately) Posted: Wed Jan 26, 2022 16:23    Post subject: Reply with quote

Ваша исходная запись означала подвыражения для поиска-замены, разделённые ровно тремя безусловно присутcтвующими чёрточками, обрамлёнными пробелами. Поэтому никакое "остальные игнорировать" тут не прокатывает: часть имён просто не находится или интерпретируется неверно. Правильный синтаксис с упаковкой всего нужного в скобки был дан позже (со всеми уточнениями), и вот там действительно учитываются только первые два подвыражения (они меняются местами с убиранием лишних разделителей), а вся следующая часть имени игнорируется (ибо $3 для замены не указано).
_________________
Даже самая богатая фантазия
Не представит себе наши безобразия.
Back to top
View user's profile Send private message
zoog



Joined: 20 Nov 2012
Posts: 7

Post (Separately) Posted: Wed Jan 26, 2022 16:47    Post subject: Reply with quote

Дошло. Нужно было дополнить (.*) - тогда обрабатывались бы лишь первые поля?
Back to top
View user's profile Send private message
Avada



Joined: 01 Aug 2008
Posts: 10252
Location: Россия, Саратов

Post (Separately) Posted: Wed Jan 26, 2022 17:57    Post subject: Reply with quote

zoog
Не только это, надо ещё нормально границы подвыражений указать и все пробелы соблюсти. Синтаксис правильного варианта проанализируйте как следует (к вашим услугам справочный раздел по регуляркам и материалы форума). В частности, ([^-]*) означает 0 или более любых символов, кроме чёрточки, а (.*) — 0 или более каких угодно символов. А чёрточка вне скобок стоит в единственном месте, где её действительно следовало указать. Дальше, если нужно, разбирайтесь самостоятельно.
_________________
Даже самая богатая фантазия
Не представит себе наши безобразия.
Back to top
View user's profile Send private message
zoog



Joined: 20 Nov 2012
Posts: 7

Post (Separately) Posted: Wed Jan 26, 2022 18:04    Post subject: Reply with quote

Quote:
В частности, ([^-]*) означает 0 или более любых символов, кроме чёрточки, а (.*) — 0 или более каких угодно символов.

Ну да, в данном случае как раз последующие чёрточки нельзя учитывать. Только первые (поля).
Back to top
View user's profile Send private message
rexen



Joined: 29 Mar 2018
Posts: 9

Post (Separately) Posted: Mon May 23, 2022 13:50    Post subject: Reply with quote

Камрады, прошу помощи.
Рядовая проблема с очисткой имён файлов (скачиваемых роликов) от всякого мусора и лишних символов.
Меня устраивает простое регулярное выражение, удаляющее всё кроме букв и цифр:
Code:
[^\wА-Яа-яёЁ ]

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

НО!

После удаления, скажем, дефиса, обрамляющие его пробелы остаются - т.е. получается задваивание пробелов.
И я уже всю голову поломал и всякие варианты поперебирал, но не могу никак придумать, как это задваивание (затраивание...) удалять этим же проходом. Вот пройтись вторым разом по тем же файлам и отдельным выражением убрать все повторяющиеся пробелы - не проблема. А вот за один проход - подозреваю, никак. Или?
Back to top
View user's profile Send private message
sa



Joined: 29 Apr 2009
Posts: 2567

Post (Separately) Posted: Mon May 23, 2022 14:42    Post subject: Reply with quote

rexen
Так не сработает?
Code:
[^\wА-Яа-яёЁ ]|[  ]
Back to top
View user's profile Send private message
rexen



Joined: 29 Mar 2018
Posts: 9

Post (Separately) Posted: Mon May 23, 2022 20:48    Post subject: Reply with quote

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

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

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

---

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

Потренироваться можно на вот таком примере:
Code:
01.  PODcast - прямой_эфир. Отвечаем , вопросы, комментарии (@17`05'2022).m4a

(здесь, кстати, по логике ещё и подчёркивание (и прочие разделяющие слова непробельные символы) надо бы пробелом заменить)
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Общие вопросы All times are GMT + 4 Hours
Goto page Previous  1, 2, 3 ... , 10, 11, 12  Next
Page 11 of 12

 
Jump to:  
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