Ru-Board.club
← Вернуться в раздел «Программы»

» Far Manager

Автор: Angel_Ka
Дата сообщения: 03.04.2016 15:12
Alexyz21

Цитата:
2. согласно вашего регэкспа матчатся как ГОСТ Р, так и без Р - нет смысла.

Для меня смысл в том, что отдельно сортируются файлы по присутствию в именах ГОСТ без Р, и обособленно с ГОСТ Р. Эти нормативные документы могут быть на одну тему, но по содержанию отличаться существенно. А в моём случае это важно, и поэтому такая сортировка сделано мною преднамеренно.

Цитата:
1. оканчивать группу на .*?| нет смысла - это матчит пусто, .*? в этом случае лучше убрать.

Если я убираю .*? из группы с ГОСТ Р, то она остаётся неотсортированной, а мне нужно её обособить. Да и вреда .*? вроде бы не приносит. А поскольку окончания имён могут быть и экзотичными, например, с повторами, в т.ч. могут повторяться и фразы ГОСТ и ГОСТ Р, то я вот на всякий случай и перестраховываюсь.

Добавлено:

Цитата:
обновил

Сейчас же посмотрю.

Добавлено:
Посмотрел. Да, порядок.

Однако, подскажите, пожалуйста, как по-новому на практике можно формировать группы? Например, на примере последнего примера. А то я пока чего то не догоняю.
Автор: YuS_two
Дата сообщения: 03.04.2016 15:30
[more] Angel_Ka

Цитата:

Код: /^(\d+?).*?[\.,;] .*?$|(\d+?)к2.*?|(\d+?).*? ГОСТ (?!Р).*?|(\d+?).*? ГОСТ Р.*?$/i{!:$1$3$2$4}
Автор: Angel_Ka
Дата сообщения: 03.04.2016 16:30
YuS_two

Цитата:
Как сказал выше, Alexyz21:

Цитата:
оканчивать группу на .*?| нет смысла - это матчит пусто, .*? в этом случае лучше убрать.

т.е. записывать регулярку на полное совпадение строки с таким окончанием широкого действия, без особой надобности, бессмысленно. Это только будет увеличивать время на проверку и на большом объеме текста могут возникать тормоза... регэкспы матчатся не только вперед по тексту, но и с возвратом, для проверки всех вариантов, ну, за исключением некоторых случаев, типа атомарных групп, сверхжадных квантификаторов и т.п....

Да, это я понял. СПАСИБО БОЛЬШОЕ Вам за более подробное разъяснение!
Поэтому, вняв совету, убираю из регекса лишние .*?, но при этом оставляю их в нужном месте для того, чтобы обеспечить отделение файлов с просто ГОСТ, без Р, от файлов с ГОСТ Р:
/^(\d+?).*?[\.,;] |(\d+?)к2|(\d+?).*? ГОСТ (?!Р)|(\d+?).*? ГОСТ Р.*?$/i{!:$1$3$2$4}

Добавлено:

Цитата:
не совсем понятно, почему группы сделаны только по цифрам, все четыре группы равны "(\d+?)"

Не равны, разумеется, а начинаются с чисел. Поскольку сортируемая база файлов, которых может быть несколько десятков тысяч и более даже, пронумерована пятизначными числами. Причём могут быть сбивки нумерации типа повторов и пропусков номеров. А также к отдельным номерам прилепляются пометки, например: 72007к2 ...
Автор: YuS_two
Дата сообщения: 03.04.2016 16:40
Angel_Ka

Цитата:
/^(\d+?).*?[\.,;] .*?$|(\d+?)к2.*?|(\d+?).*? ГОСТ (?!Р).*?|(\d+?).*? ГОСТ Р.*?$/i{!:$1$3$2$4}

Тогда с уточнениями, попробуйте так:

Код: /^(?:(\d+?.*?[\.,;] )|(\d+?к2)|(\d+?.*? ГОСТ (?!Р))|(\d+?.*? ГОСТ Р))/i{!:$1$3$2$4}
Автор: Angel_Ka
Дата сообщения: 03.04.2016 16:41

Цитата:
Вообще, регэкспы составлять лучше в необходимом минимуме, без излишеств

В данном случае для меня .*? и есть тот самый необходимый минимум. Поскольку другого варианта отделить просто ГОСТ от ГОСТ Р я пока не знаю.
Автор: YuS_two
Дата сообщения: 03.04.2016 16:49
Angel_Ka

Цитата:
В данном случае для меня .*? и есть тот самый необходимый минимум.

не-не-не, тут Вы где-то запутались, поскольку шаблон ".*?" буквально означает: ноль или более любых символов в минимальном количестве (по-хорошему, это должен быть всего один любой символ, если в общем шаблоне за ним ничего не следует), в том числе и пусто - не знаю как именно FAR обрабатывает эту ситуацию... но в любом случае, этот шаблон не зависит и не влияет на наличие/отсутствие "Р".

Добавлено:
Angel_Ka

Цитата:
\d+?

И ещё, почему используется именно нежадный квантификатор во всех случаях? Тут бы наоборот, сделать его сверхжадным для ускорения обработки...
Автор: Angel_Ka
Дата сообщения: 03.04.2016 16:53
YuS_two

Цитата:
Тогда с уточнениями, попробуйте так:

Код:
/^(?:(\d+?.*?[\.,;] )|(\d+?к2)|(\d+?.*? ГОСТ (?!Р))|(\d+?.*? ГОСТ Р))/i{!:$1$3$2$4}

Да, так кажется подходит. БОЛЬШУЩЕЕ СПАСИБО за помощь!

Но поясните, пожалуйста, за счёт чего Вы этого добились? И отдельно ещё что означает метка ?: в первой группе?
Автор: Alexyz21
Дата сообщения: 03.04.2016 16:55
Angel_Ka
Понравились регэкспы?

Новая плюшка подробно описана в п.4
Автор: Angel_Ka
Дата сообщения: 03.04.2016 17:05
Alexyz21

Цитата:
Новая плюшка подробно описана в п.4

Вы пишите макросы намного быстрее, чем я успеваю их осваивать! Сейчас с удовольствием посмотрю.

Автор: Alexyz21
Дата сообщения: 03.04.2016 17:15

Цитата:
Вы пишите макросы намного быстрее, чем я успеваю их осваивать!

Не, это я ошибки успеваю быстрее делать, чем вы их осваивать приходится править

Имхо имеющийся инструментарий позволяет производить самые изощрённые сортировки, не хватает только истории для Regex и Func() и, наверное, help'a ввиду разросшейся функциональности.
Автор: Angel_Ka
Дата сообщения: 03.04.2016 17:21
С прежними регексами, в т.ч. с подскзанным YuS_two, работает отлично!
БОЛЬШОЕ СПАСИБО!

А вот новые варианты опробую позднее.
Автор: YuS_two
Дата сообщения: 03.04.2016 18:21
Angel_Ka

Цитата:
поясните, пожалуйста, за счёт чего Вы этого добились?

Боюсь, нас скоро отсюда погонят за оффтопик, с нашими регэкспами... но раз уж есть привязка к FAR-у, то:
За счет групп, под которые выделяется отдельная память и они соответственно нумеруются:

Код: /^(?:(ш1)|(ш2)|(ш3)|(ш4))/i{!:$1$3$2$4}
Автор: Angel_Ka
Дата сообщения: 03.04.2016 19:58
YuS_two

БОЛЬШОЕ СПАСИБО Вам за доходчивые пояснения!

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

БЛАГОДАРЮ Вас за добрую отзывчивость!
Автор: YuS_two
Дата сообщения: 03.04.2016 20:16
Angel_Ka

Цитата:
на одном хелпе не очень то скоро бы я продвинулся в понимании регэкспов, осознании их возможностей и усвоении применения их в Фаре.

Зачем в хелпе описывать то, для чего существует достаточно много всякой литературы? Он от этого только разбухнет и даже возможно, напугает неопытного пользователя... имхо, всему свое время.
Вижу, книгу, которую советовал выше, Вы пока не изучали, а ведь там есть всё про регулярки. После её изучения, уже не понадобятся никакие хелпы, только если небольшие памятки...
Автор: Angel_Ka
Дата сообщения: 03.04.2016 20:44
YuS_two

Цитата:
Цитата:
\d+?

И ещё, почему используется именно нежадный квантификатор во всех случаях? Тут бы наоборот, сделать его сверхжадным для ускорения обработки...

Вы имеете ввиду лучше так:
/^(?:(\d{5}.*?[\.,;] )|(\d{5}к2)|(\d{5}.*? ГОСТ (?!Р))|(\d{5}.*? ГОСТ Р))/i{!:$1$3$2$4}
?

Цитата:
Вижу, книгу, которую советовал выше, Вы пока не изучали

Почему же? Очень рад Вашему совету, начал штудировать. Но там же 598 страниц. Скоро детективы читаются, а тут думать надо, возвращаться к прочитанному, снова думать, практиковаться и снова ...
Автор: YuS_two
Дата сообщения: 03.04.2016 21:03
[more] [more][/more]
Angel_Ka

Цитата:
Вы имеете ввиду лучше так:
/^(?:(\d{5}.*?[\.,;] )|(\d{5}к2)|(\d{5}.*? ГОСТ (?!Р))|(\d{5}.*? ГОСТ Р))/i{!:$1$3$2$4}
?

Нет, так будет хуже, потому, что будут захватываться строго 5 цифр, не больше и не меньше... а если их будет больше или меньше в начале строки, то и совпадения не будет найдено.
Но со сверхжадностью, это я поторопился, в FAR-e, судя по хелпу, её просто нет, присутствуют только жадные и ленивые квантификаторы. Тогда можно и не забивать голову, т.к. выигрыша особого не будет, в данном случае... только если, визуально шаблон будет выглядеть чуть проще:

Код: /^(?:(\d+.*?[\.,;] )|(\d+к2)|(\d+.*? ГОСТ (?!Р))|(\d+.*? ГОСТ Р))/i{!:$1$3$2$4}
Автор: Angel_Ka
Дата сообщения: 03.04.2016 21:49
YuS_two

Цитата:
Код:
/^(?:(\d+.*?[\.,;] )|(\d+к2)|(\d+.*? ГОСТ (?!Р))|(\d+.*? ГОСТ Р))/i{!:$1$3$2$4}

Да, шаблон работает. БОЛЬШОЕ СПАСИБО за совет и пояснение к нему! Очень рад, ведь общеизвестно, что с применением наставлений освоение материала продвигается существенно быстрее.


Добавлено:
И всё таки возник вопрос: если быть уверенным, что в начале имён файлов всегда строго 5 цифр, то ведь было бы предпочтительнее применять "{5}", а не "+" ?
Автор: Alexyz21
Дата сообщения: 03.04.2016 22:52
Angel_Ka
Было бы любопытно увидеть рапорты сравнения быстродействия различных вариантов регэспов: жадных, нежадных, фиксированных и тд. при одинаковых результатах сортировки. Формат - регулярное выражение и рапорт на тестовой базе.
Автор: Angel_Ka
Дата сообщения: 03.04.2016 23:31
Alexyz21
Постараюсь завтра-послезавтра это организовать. На домашнем же микро-тесте мне кажется это вообще не имеет смысла, поскольку он дюже утрированный.

Добавлено:
YuS_two

Вы навели меня на очень полезную мысль проверять наличие возможных ошибок — непятизначных чисел в начале имён файлов. И у меня получился следующий вполне работающий регэксп:
/^(?:(\d{5}.*?[\.,;] )|(\d{5}к2)|(\d{5}\D+ГОСТ (?!Р))|(\d{5}\D+ГОСТ Р)|(\d{1,4}\D)|(\d{5}\d+))/i{!:$6$5$1$3$2$4}
Автор: Alexyz21
Дата сообщения: 03.04.2016 23:42
Это ни к чему не обязывающее пожелание.

Shmuel
Странно в поиске на форуме не нашёл, а вроде бы уже спрашивал у вас, да за склерозом забыл ответ. - Почему нет метода gmatch?
Автор: Angel_Ka
Дата сообщения: 03.04.2016 23:45
YuS_two

Регэксп /^(?:(\d{5}.*?[\.,;] )|(\d{5}к2)|(\d{5}\D+ГОСТ (?!Р))|(\d{5}\D+ГОСТ Р)|(\d{1,4}\D)|(\d{5}\d+))/i{!:$6$5$1$3$2$4}, применённый в макросе Panel.CustomSortByName.lua, сортирует файлы в следующем порядке:

1) файлы, в начале имён которых больше 5 цифр;
2) файлы, в начале имён которых меньше 5 цифр;
3) файлы, в именах которых есть точки, запятые и точки с запятыми;
4) файлы, в именах которых есть слово ГОСТ без последующего Р;
5) файлы, в начале имён которых к начальным пятизначным числам вплотную примыкает метка "к2";
6) файлы, в именах которых есть метка ГОСТ Р.

Добавлено:
Alexyz21

Цитата:
Это ни к чему не обязывающее пожелание.

Но мне и самому это теперь интересно. Попытаюсь сделать для начала так, как сам понимаю. А там видно будет. Если есть или будут конкретные виды, напишите. Даже если не смогу из-за занятости оперативно ответить, то прочитать смогу.
Автор: shmuz1
Дата сообщения: 04.04.2016 00:08
Alexyz21

Цитата:
Почему нет метода gmatch?

Функции, начинающиеся с "g" (т.е. "global") имеют внутренний цикл, и они внутри компилируют стринг-регексп до этого цикла. Поэтому метод особого выигрыша не даёт по сравнению с функцией. Метод gsub тоже можно было бы убрать.
Автор: YuS_two
Дата сообщения: 04.04.2016 07:22
[more] Angel_Ka

Цитата:
если быть уверенным, что в начале имён файлов всегда строго 5 цифр, то ведь было бы предпочтительнее применять "{5}", а не "+" ?

Всё зависит от конечной цели. В принципе, Вы уже самостоятельно разобрались... и применили практически.
А если сравнивать по затратности, то да, конечно, ограниченный шаблон будет более скоростным, чем неопределенный в конечности захватываемого текста, например:

Код:
12345абв
1234абв
Автор: Angel_Ka
Дата сообщения: 04.04.2016 08:41
YuS_two
БОЛЬШОЕ СПАСИБО за разъяснение! Иногда важно просто знать, что сделал правильно, без существенных ошибок. И тут без компетентных консультаций не обойтись. БЛАГОДАРЮ Вас за терпеливые наставления!

P.S. судя по приведённым Вами в последнем посте примерам, у профессиональных составителей регэкспов с упорством и юмором всё в порядке.
Автор: shmuz1
Дата сообщения: 04.04.2016 08:54
Коллеги, регекспы - очень интересная тема (постоянно и с удовольствием пользуюсь ими). Но этот раздел всё же предназначен для обсуждения Far Manager. Мне кажется офф-топик уже просто зашкаливает.
Автор: Angel_Ka
Дата сообщения: 04.04.2016 09:55
Victor_VG
Да, увлеклись регекспами, особенно я, каюсь. Но ведь не преднамеренно же. А замечание shmuz1 вполне резонно, да и YuS_two ранее уже предполагал такое.

Но и тему применения регэкспов желательно было бы не обрывать совсем. Поэтому нельзя ли попросить модераторов обособить те посты, которые касались регулярок, например в отдельную тему "Применение регулярных выражений в Far Manager"?

Автор: Benchmark
Дата сообщения: 04.04.2016 14:56
Angel_Ka

Цитата:
Поэтому нельзя ли попросить модераторов обособить те посты, которые касались регулярок, например в отдельную тему "Применение регулярных выражений в Far Manager"?

А кто мешает создать такую тему ? Модераторы тут вообще ни при чём.
Автор: Angel_Ka
Дата сообщения: 04.04.2016 18:16
Alexyz21
Рапорт кинул в личку.
Автор: Angel_Ka
Дата сообщения: 04.04.2016 22:28
Benchmark

Цитата:
А кто мешает создать такую тему ?

Персонально для меня есть некоторые непреодолимые объективные препятствия. Но был бы рад, если бы это сделал кто-то из заинтересованных лиц.


Цитата:
Модераторы тут вообще ни при чём.

Для создания новой темы, да. Но перенести отсюда в другую тему несколько постов, которые для данной ветки оффтопик, как же без модераторов то?



Автор: Victor_VG
Дата сообщения: 04.04.2016 22:30
Angel_Ka

Пока не стоит - надо форум починить, а тему - в принципе можно и создать почему бы и нет? И ссылку добавить в шапку, но я бы чуть подождал чтобы не создавать проблем ремонтной группе - новая тема созданная в момент ремонта это потенциальный сбой, а он нам сейчас сильно нужен?

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566

Предыдущая тема: оффтоп


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.