Страница 11 из 13

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

Добавлено: Сб янв 22, 2022 19:14
sa
zoog
Можно так попробовать искать, если задвоенный пробел в результате не смущает:
([^-]*) - ([^-]*)(.*)
От задвоения можно избавиться, добавив пробел после маски файла [N] и в выражении для поиска, перед (.*).

Добавлено: Вс янв 23, 2022 08:30
Avada
sa
Да, с указанными поправками работает. (Если, как было сказано выше, техзадание понято правильно.)
Упомяну также для ясности про указание $2 $1 в поле "Заменить на", включение опции "Рег. выраж." и выключение опции [E].

Добавлено: Вс янв 23, 2022 10:03
sa
Avada писал(а):с указанными поправками работает.
К сожалению, не в случае, когда в полях "автор" и/или "год" присутствует тире…
Тут, как вариант, потребуется предварительный проход переименования с заменой тире в разделителе полей (пробел-тире-пробел) на какой-нибудь экзотический символ, которого заведомо нет в содержимом первых двух полей и правка выражения для поиска с заменой (в трёх местах) тире на этот символ.

Добавлено: Вс янв 23, 2022 16:51
Avada
sa
Да, но в случае редких исключений можно и выполнить точечную правку. Кроме того, всё-таки в обсуждаемом виде это не тире, а дефис (чёрточка, минус, -). А тире бывает короткое (–) и длинное (—).

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

Добавлено: Ср янв 26, 2022 10:15
Avada
zoog
Не только в полях дело, а ещё и в чёрточках-разделителях между скобками, которых при вашей форме записи можно найти ровно столько, сколько было указано, а если их по факту меньше/больше, наперекосяк идёт вся операция. А что счёт подвыражений для поиска-замены (при правильном синтаксисе, естественно) идёт именно с начала, сказано в справке TC.
Поскольку рабочее решение вашей задачи дано, то обсуждать тут дальше, кто что имел в виду, особого смысла не вижу. Если очень интересно — читайте справку и экспериментируйте самостоятельно.

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

Добавлено: Ср янв 26, 2022 15:23
Avada
Ваша исходная запись означала подвыражения для поиска-замены, разделённые ровно тремя безусловно присутcтвующими чёрточками, обрамлёнными пробелами. Поэтому никакое "остальные игнорировать" тут не прокатывает: часть имён просто не находится или интерпретируется неверно. Правильный синтаксис с упаковкой всего нужного в скобки был дан позже (со всеми уточнениями), и вот там действительно учитываются только первые два подвыражения (они меняются местами с убиранием лишних разделителей), а вся следующая часть имени игнорируется (ибо $3 для замены не указано).

Добавлено: Ср янв 26, 2022 15:47
zoog
Дошло. Нужно было дополнить (.*) - тогда обрабатывались бы лишь первые поля?

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

Добавлено: Ср янв 26, 2022 17:04
zoog
В частности, ([^-]*) означает 0 или более любых символов, кроме чёрточки, а (.*) — 0 или более каких угодно символов.
Ну да, в данном случае как раз последующие чёрточки нельзя учитывать. Только первые (поля).

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

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

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

НО!

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

Добавлено: Пн май 23, 2022 13:42
sa
rexen
Так не сработает?

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

[^\wА-Яа-яёЁ ]|[  ]

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

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

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

---

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

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

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

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