Page 9 of 28
Posted: Sun Jan 12, 2014 11:46 pm
by Drugmix
Instructor
а Вы бы не могли, пожалуйста, прикрутить работу вот таких выражений:
так же, как они срабатывают на regex101.com?
regex101.com:

а в akelpad'е не срабатывает вот эта часть
из вышеприведённого правила и получается вот так:

Posted: Mon Jan 13, 2014 1:14 pm
by YuS
Drugmix wrote:прикрутить работу вот таких выражений:
А что в AP с ними не так?
Drugmix wrote:
а в akelpad'е не срабатывает вот эта часть
Не совсем понятно, почему она должна сработать?
"|" - метасимвол со значением "или", т.е. найдено может быть что-то одно, так что всё логично.
Тут надо уточнить регулярку, для того, чтобы находилось именно то, что требуется...
ЗЫ А вот реализация поиска по условию очень бы пригодилась в AP не lookahead и lookbehind, а именно поиск по условию:
(?(...)...) - условие [если, то]
(?(...)...|...) - условие [если, то, а иначе]
Добавлено:
ЗЗЫ А, понял о чем речь... выше ведь этот вопрос задавался. В AP захваченный символ повторно уже не просматривается, т.е. не срабатывает именно Positive Lookbehind. По идее, да, лучше, чтобы была такая возможность просмотра, но тут ведь поиск может вестись в режиме немедленной замены, поэтому совпадения с исходным текстом уже может не быть ... наверное, оптимальным выходом была бы опция, если это вообще возможно.
Posted: Mon Jan 13, 2014 3:34 pm
by Drugmix
YuS
всё дело в том, что хочется научить акелпад правильно окрашивать аргументы у команд, с учётом того, что аргументы могут содержать экранированные символы разделителей команд.
Вот взять AutoHotkey: там аргументы у команд разделяются запятой
Code: Select all
Команда, аргумент1, аргумент2, аргумент3, …, аргументN
но если запятая "экранирована", то она перестаёт быть разделителем и становится частью аргумента:
Code: Select all
Команда, аргумент1, аргумент2_часть1`,аргумент2_часть2, аргумент 3
И получается, что сейчас нельзя составить правило для QuotesRE так, чтобы подсветка на этом примере не поломалась и раскрасила бы строку как команду с тремя аргументами, а не четырьмя

Posted: Mon Jan 13, 2014 7:24 pm
by Serge Yolkin
Drugmix
Не знаю AutoHotkey, но, если синтаксис [запятая][\s*][слово][запятая] всегда соответствует аргументу, то в чём проблема?
Здесь выделял js регулярку с учетом возможного экранирования \/
Posted: Mon Jan 13, 2014 7:51 pm
by Drugmix
Serge Yolkin
в том, что аргументы бывают разных типов и вся задумка в том, чтобы подсветить их по типу. Для каждого аргумента каждой команды.
И да, [запятая] в конце - опциональна, а [слово] может содержать экранированную запятую.
Posted: Tue Jan 14, 2014 11:02 am
by Serge Yolkin
Drugmix
А что-нибудь типа (?<=\,).*[^`](?=(\,|$)) работать не будет?
Posted: Tue Jan 14, 2014 11:27 am
by Drugmix
Serge Yolkin
во-первых, запятые - не экранируемые символы.
во-вторых, мне надо, чтобы всё это захватилось, а значит должно быть в
(), но
YuS wrote:В AP захваченный символ повторно уже не просматривается, т.е. не срабатывает именно Positive Lookbehind
в-третьих, я всё же проверил в своём правиле и оно стало приводить к краху АкелПада
Code: Select all
0 "^\s*(((Try)|(Else))(?:\s*,\s*|\s+)|(.{1,38}(?=::))(?:::))?\s*(#IfWinActive\b)(?:\s*,\s*?)?((?<=,).*[^`](?=(,|$)))*?)?(\s+;.*$)?((?<=,).*[^`](?=(,|$)))?(\s+;.*)?$" `\3=(4,${OP},0) \4=(4,${IF},0) \5=(2,${STR},0) \6=(2,${OP},0) \8=(2,${ATTR},0) \9=(3,${COMM},0) \11=(2,${ATTR},0) \12=(3,${COMM},0)`
Posted: Tue Jan 14, 2014 11:55 am
by Serge Yolkin
Drugmix
1. Где как... с экраном везде работает.
2-3. Я идею предложил, а не реализацию. А идея заключалась в том, чтобы команду захватывать отдельно, а в следующем правиле разбирать аргументы. Вот под это второе правило я болванку и предложил, без подсветок (скобок). Do You speak RegExp?
Posted: Tue Jan 14, 2014 12:08 pm
by Drugmix
Serge Yolkin
няня, я у них поел.
Вы предлагаете использовать 2 правила вместо одного? Вы же сами
выступали против моего предложения добавить каскадную работу правилам! Без этого одно правило будет просто перебивать другое.
Can you into logics?
Posted: Tue Jan 14, 2014 12:22 pm
by Serge Yolkin
Drugmix wrote:Без этого одно правило будет просто перебивать другое.
С какого перепугу? В первом правиле захватываем команду до первой запятой, не захватывая саму запятую, во втором - ловим то, что между неэкранированными запятыми или запятой и концом строки (не захватывая запятые - пусть раскрашиваются как разделители). Где тут каскадное наложение? А Вы что же, в каждом правиле строку целиком обрабатываете? (готов офигеть от положительного ответа)
Posted: Tue Jan 14, 2014 12:25 pm
by YuS
Drugmix wrote:
И да, [запятая] в конце - опциональна, а [слово] может содержать экранированную запятую.
Имхо, для частного случая, хорошим выходом из положения, была бы возможность использования других символов для разделения частей аргументов... или это в принципе невозможно в синтаксисе того языка?
Posted: Tue Jan 14, 2014 12:30 pm
by YuS
Serge Yolkin wrote:готов офигеть от положительного ответа
Если я правильно понял, тут вся трудность в том, как объяснить регулярке (в реализации AP), что такое разделитель "," и экранированный разделитель "`,", причем с учетом того, что захваченный символ никаким lookahead и lookbehind уже никак не просмотреть.
Posted: Tue Jan 14, 2014 12:33 pm
by Serge Yolkin
YuS
Экранирование я в своём примере объяснил...
Posted: Tue Jan 14, 2014 12:38 pm
by Serge Yolkin
Instructor,
DV, удалось грохнуть и тестовую:
проблема в двух не пришей чего к чему закрывающих скобках в конце (остаток от конструкции (?=...) во время редактирования) статистику не проводил, но если добавить две закрывающие к другим (не уверен, что к любым, но у меня - три из трёх) регуляркам - результат тот же.
Posted: Tue Jan 14, 2014 12:48 pm
by YuS
Drugmix wrote:
во-вторых, мне надо, чтобы всё это захватилось, а значит должно быть в
(), но
YuS wrote:В AP захваченный символ повторно уже не просматривается, т.е. не срабатывает именно Positive Lookbehind
Можно попытаться как-то так соорудить шаблон:
Code: Select all
([^;,`]*(?!`,)|[^,;]*?`,[^,;`]*?)*