View previous topic :: View next topic |
Как часто вы пользуетесь регулярными выражениями (RegEx)? |
Раз в день |
|
33% |
[ 34 ] |
Раз в неделю |
|
18% |
[ 19 ] |
Раз в месяц |
|
27% |
[ 28 ] |
А что это такое? |
|
19% |
[ 20 ] |
|
Total Votes : 101 |
|
Author |
Message |
Avada
![](images/avatars/765200809489b35982c966.jpg)
Joined: 01 Aug 2008 Posts: 10275 Location: Россия, Саратов
|
(Separately) Posted: Sat Jan 22, 2022 19:53 Post subject: |
|
|
zoog
1. В справочном примере только два подвыражения меняются местами (причём с указанием расширения), так что ваше "простое действие" не оттуда.
2. Вопрос надо формулировать не с "типа", а точно. Каких полей не бывает? Третьего и/или четвёртого? Правильно ли я понял, что при любом варианте должны остаться только первые два поля с начала, переставленные местами и разделённые одним пробелом? Или нет? (Кстати, для переменного числа полей ваше выражение в любом случае не годилось бы уже потому, что все чёрточки за пределами скобок указаны как реальные символы в точном количестве три штуки.)
2. Для обсуждения регулярных выражений на форуме есть общие темы, и создание новых тем по каждому частному вопросу — явно не самая хорошая идея. Перенесено по принадлежности. _________________ Даже самая богатая фантазия
Не представит себе наши безобразия. |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
sa
Joined: 29 Apr 2009 Posts: 2577
|
(Separately) Posted: Sat Jan 22, 2022 20:14 Post subject: |
|
|
zoog
Можно так попробовать искать, если задвоенный пробел в результате не смущает:
([^-]*) - ([^-]*)(.*)
От задвоения можно избавиться, добавив пробел после маски файла [N] и в выражении для поиска, перед (.*). |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
Avada
![](images/avatars/765200809489b35982c966.jpg)
Joined: 01 Aug 2008 Posts: 10275 Location: Россия, Саратов
|
(Separately) Posted: Sun Jan 23, 2022 09:30 Post subject: |
|
|
sa
Да, с указанными поправками работает. (Если, как было сказано выше, техзадание понято правильно.)
Упомяну также для ясности про указание $2 $1 в поле "Заменить на", включение опции "Рег. выраж." и выключение опции [E]. _________________ Даже самая богатая фантазия
Не представит себе наши безобразия. |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
sa
Joined: 29 Apr 2009 Posts: 2577
|
(Separately) Posted: Sun Jan 23, 2022 11:03 Post subject: |
|
|
Avada wrote: | с указанными поправками работает. |
К сожалению, не в случае, когда в полях "автор" и/или "год" присутствует тире…
Тут, как вариант, потребуется предварительный проход переименования с заменой тире в разделителе полей (пробел-тире-пробел) на какой-нибудь экзотический символ, которого заведомо нет в содержимом первых двух полей и правка выражения для поиска с заменой (в трёх местах) тире на этот символ. |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
Avada
![](images/avatars/765200809489b35982c966.jpg)
Joined: 01 Aug 2008 Posts: 10275 Location: Россия, Саратов
|
(Separately) Posted: Sun Jan 23, 2022 17:51 Post subject: |
|
|
sa
Да, но в случае редких исключений можно и выполнить точечную правку. Кроме того, всё-таки в обсуждаемом виде это не тире, а дефис (чёрточка, минус, -). А тире бывает короткое (–) и длинное (—). _________________ Даже самая богатая фантазия
Не представит себе наши безобразия. |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
zoog
Joined: 20 Nov 2012 Posts: 7
|
(Separately) Posted: Wed Jan 26, 2022 00:32 Post subject: |
|
|
Avada, пардон что не отвечал - уведомления не сработали, видимо.
1) А какая разница, сколько полей? Всё, что больше 1го - логически монопенисуально, не? Если б нумерация шла с 1го - всё б у меня получилось.
2) У нас есть 3-4-возможно более полей (мне интересно решить общий случай), поменять первые 2-3, гарантированно присутствующие.
Quote: | для переменного числа полей ваше выражение в любом случае не годилось бы уже потому, что все чёрточки за пределами скобок указаны как реальные символы в точном количестве три штуки. |
Не понял(( если реальное число полей меньше, чем в моём выражении - всё сломается, имеете в виду.
2) Не разобрался сразу, спасибо за перенос.
sa wrote: |
Можно так попробовать искать, если задвоенный пробел в результате не смущает:
([^-]*) - ([^-]*)(.*) |
Так, мы заменяем (всё, что угодно) на (любую последовательность символов без тире) - это типа упрощает логику поиска?
Спасибо)
Работает. Так проблема была не в том, что группы искались с конца имени? |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
Avada
![](images/avatars/765200809489b35982c966.jpg)
Joined: 01 Aug 2008 Posts: 10275 Location: Россия, Саратов
|
(Separately) Posted: Wed Jan 26, 2022 11:15 Post subject: |
|
|
zoog
Не только в полях дело, а ещё и в чёрточках-разделителях между скобками, которых при вашей форме записи можно найти ровно столько, сколько было указано, а если их по факту меньше/больше, наперекосяк идёт вся операция. А что счёт подвыражений для поиска-замены (при правильном синтаксисе, естественно) идёт именно с начала, сказано в справке TC.
Поскольку рабочее решение вашей задачи дано, то обсуждать тут дальше, кто что имел в виду, особого смысла не вижу. Если очень интересно — читайте справку и экспериментируйте самостоятельно. _________________ Даже самая богатая фантазия
Не представит себе наши безобразия. |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
zoog
Joined: 20 Nov 2012 Posts: 7
|
(Separately) Posted: Wed Jan 26, 2022 15:08 Post subject: |
|
|
Avada,
Quote: | которых при вашей форме записи можно найти ровно столько, сколько было указано |
Ну да, найти столько, остальные игнорировать. Разве не так программирование / обработка ошибок работает?)
Quote: | А что счёт подвыражений для поиска-замены (при правильном синтаксисе, естественно) идёт именно с начала, сказано в справке TC. |
Счёт (порядок счёта) идёт с первого, но само первое поле (при числе полей, бОльшем указанного) выбирается не с начала, то есть при 3х полях в условии и 5 полях на входе считается не $1 $2 $3**, a **$1 $2 $3.
Ещё раз спасибо за помощь. |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
Avada
![](images/avatars/765200809489b35982c966.jpg)
Joined: 01 Aug 2008 Posts: 10275 Location: Россия, Саратов
|
(Separately) Posted: Wed Jan 26, 2022 16:23 Post subject: |
|
|
Ваша исходная запись означала подвыражения для поиска-замены, разделённые ровно тремя безусловно присутcтвующими чёрточками, обрамлёнными пробелами. Поэтому никакое "остальные игнорировать" тут не прокатывает: часть имён просто не находится или интерпретируется неверно. Правильный синтаксис с упаковкой всего нужного в скобки был дан позже (со всеми уточнениями), и вот там действительно учитываются только первые два подвыражения (они меняются местами с убиранием лишних разделителей), а вся следующая часть имени игнорируется (ибо $3 для замены не указано). _________________ Даже самая богатая фантазия
Не представит себе наши безобразия. |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
zoog
Joined: 20 Nov 2012 Posts: 7
|
(Separately) Posted: Wed Jan 26, 2022 16:47 Post subject: |
|
|
Дошло. Нужно было дополнить (.*) - тогда обрабатывались бы лишь первые поля? |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
Avada
![](images/avatars/765200809489b35982c966.jpg)
Joined: 01 Aug 2008 Posts: 10275 Location: Россия, Саратов
|
(Separately) Posted: Wed Jan 26, 2022 17:57 Post subject: |
|
|
zoog
Не только это, надо ещё нормально границы подвыражений указать и все пробелы соблюсти. Синтаксис правильного варианта проанализируйте как следует (к вашим услугам справочный раздел по регуляркам и материалы форума). В частности, ([^-]*) означает 0 или более любых символов, кроме чёрточки, а (.*) — 0 или более каких угодно символов. А чёрточка вне скобок стоит в единственном месте, где её действительно следовало указать. Дальше, если нужно, разбирайтесь самостоятельно. _________________ Даже самая богатая фантазия
Не представит себе наши безобразия. |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
zoog
Joined: 20 Nov 2012 Posts: 7
|
(Separately) Posted: Wed Jan 26, 2022 18:04 Post subject: |
|
|
Quote: | В частности, ([^-]*) означает 0 или более любых символов, кроме чёрточки, а (.*) — 0 или более каких угодно символов. |
Ну да, в данном случае как раз последующие чёрточки нельзя учитывать. Только первые (поля). |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
rexen
Joined: 29 Mar 2018 Posts: 9
|
(Separately) Posted: Mon May 23, 2022 13:50 Post subject: |
|
|
Камрады, прошу помощи.
Рядовая проблема с очисткой имён файлов (скачиваемых роликов) от всякого мусора и лишних символов.
Меня устраивает простое регулярное выражение, удаляющее всё кроме букв и цифр:
^ - "кроме"
\w - латинские цифробуквы
А-Яа-яёЁ - кирилица
(пробелы оставляем)
НО!
После удаления, скажем, дефиса, обрамляющие его пробелы остаются - т.е. получается задваивание пробелов.
И я уже всю голову поломал и всякие варианты поперебирал, но не могу никак придумать, как это задваивание (затраивание...) удалять этим же проходом. Вот пройтись вторым разом по тем же файлам и отдельным выражением убрать все повторяющиеся пробелы - не проблема. А вот за один проход - подозреваю, никак. Или? |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
sa
Joined: 29 Apr 2009 Posts: 2577
|
(Separately) Posted: Mon May 23, 2022 14:42 Post subject: |
|
|
rexen
Так не сработает?
|
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
rexen
Joined: 29 Mar 2018 Posts: 9
|
(Separately) Posted: Mon May 23, 2022 20:48 Post subject: |
|
|
sa, нет, Ваша регулярка удаляет все пробелы подчистую.
Я так задавать "двойной пробел" пробовал самыми разными способами.
Тут, видимо, причина не в том, чтобы извернуться и выдумать некое неординарное регулярное выражение, а в самом принципе, который никак кроме в 2 шага не реализовать:
1) УДАЛИТЬ все неалфавитные символы
2) ЗАМЕНИТЬ множественные пробелы ОДНИМ пробелом
Т.е. мало того, что это две разные операции - в первой всё найденное заменяется ничем, а во второй - одинарным пробелом, так ещё и после прохода первой операции появляются эти самые лишние пробелы. Я в регулярках не спец - не в курсе как они там внутри обрабатываются - можно ли вообще в принципе организовать двойной проход одним выражением. Как программист-junior пока сомневаюсь.
---
Разве что напихать некий массив-перечисление всевозможных комбинаций пробельных/неалфавитных символов с ЗАМЕНОЙ любой из них на один пробел. Но уж больно некрасивый выход, да и число комбинаций слишком большое - придётся оставлять только самые очевидные.
Потренироваться можно на вот таком примере:
Code: | 01. PODcast - прямой_эфир. Отвечаем , вопросы, комментарии (@17`05'2022).m4a |
(здесь, кстати, по логике ещё и подчёркивание (и прочие разделяющие слова непробельные символы) надо бы пробелом заменить) |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
|
|
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
|