Page 12 of 28
Posted: Thu Jan 16, 2014 10:09 pm
by Serge Yolkin
Instructor
Да, похоже, поторопился... Но и с вновь скачанной беда:
"Прекращена работы программы" и из поиска, и из QSearch. На стабильной и всех тестовых. Забавно: ^[^\d] в начале не приводит к проблеме (забавно то, что слэш я просто пропустил

)
Ага! К проблеме приводит ещё
И ещё: при том, что я не против демократии (?<=) и (?<=|) по-моему, всё-таки, снтаксическая ошибка. Хотя, можно прикинуть как это использовать

Posted: Fri Jan 17, 2014 2:36 am
by YuS
Drugmix wrote:
эээ, Смещение происходит только если в вышеобозначенной конструкции использовать \1, я же использовал \2 и \3 для окраски, как раз чтобы разделить их.
Исправлено:
Сорри, это я спутал атомарную с обычной группой...
Но там в каком-то варианте у меня были проблемы с раскраской, потому и изменил шаблон, после чего раскраска вернулась в норму. Возможно, что проявилась какая-то особенность реализации AP и плагина, в подробности не вдавался.
Drugmix wrote:блин, а на последней версии перестали подкрашиваться строки, начинающиеся с MButton:: :-/
Значит где-то допущена ошибка.

Posted: Fri Jan 17, 2014 6:40 am
by YuS
Serge Yolkin wrote:Instructor
И ещё: при том, что я не против демократии (?<=) и (?<=|) по-моему, всё-таки, снтаксическая ошибка. Хотя, можно прикинуть как это использовать

Отчего же ошибка? Вполне описано в PCRE
(?<= шаблон) - positive lookbehind
Posted: Fri Jan 17, 2014 9:27 am
by DrakonHaSh
подскажите плиз как в данный момент лучше всего искать регулярку в строке ?
привычное ^.*==.*$ и ^.*?==.*?$ не работает
непривычное \n.*?==.*?\n и \r\n.*?==.*?\r\n тоже не работает
в документации ответа на этот элементарный вопрос не нашел ::(
Posted: Fri Jan 17, 2014 9:55 am
by Drugmix
YuS
там, где подсвечивается MButton:: значит не подсвечиваются либо строки с ` без запятой после неё, либо с аргументом из двух слов, либо с комментарием в конце строки, либо с Else,Try.
Posted: Fri Jan 17, 2014 10:34 am
by Serge Yolkin
YuS
=шаблон, а шаблона нет. Я буквально написал, ничего не пропуская, и это работает, как () пустое выражение.
DrakonHaSh
Э-э-э... А привычное из какого языка? Я про == не очень понял.
Posted: Fri Jan 17, 2014 11:17 am
by DrakonHaSh
Serge Yolkin wrote:YuS
=шаблон, а шаблона нет. Я буквально написал, ничего не пропуская, и это работает, как () пустое выражение.
DrakonHaSh
Э-э-э... А привычное из какого языка? Я про == не очень понял.
==
это то, что я искал - для примера. т.е. найти строки в которых содержится "==".
Posted: Fri Jan 17, 2014 11:17 am
by Drugmix
DrakonHaSh
а по какому признаку отделять регулярку в строке от строки без регулярки?
По Вашей регулярке похоже, что она скорей для каких-то присваиваний, типа var == 9.
Posted: Fri Jan 17, 2014 12:16 pm
by DrakonHaSh
Drugmix wrote:DrakonHaSh
а по какому признаку отделять регулярку в строке от строки без регулярки?
По Вашей регулярке похоже, что она скорей для каких-то присваиваний, типа var == 9.
вот жеж я неудачный пример придумал видимо ))
пофик что искать - абы оно было на одной строке.
тут пример написал
http://www.phpliveregex.com/p/36S + перейти на вкладку справа preg_match_all
Posted: Fri Jan 17, 2014 12:49 pm
by YuS
DrakonHaSh wrote:
привычное ^.*==.*$ и ^.*?==.*?$ не работает
Drugmix wrote:
там, где подсвечивается MButton:: значит не подсвечиваются либо строки с ` без запятой после неё, либо с аргументом из двух слов, либо с комментарием в конце строки, либо с Else,Try.
В массив возможных вариантов добавьте все возможные варианты.
Чуть выше я ссылку давал на файлы, там есть файл с предложенными Вами вариантами, в которых эти именно отсутствуют.
Posted: Fri Jan 17, 2014 12:59 pm
by YuS
Serge Yolkin wrote:YuS
=шаблон, а шаблона нет. Я буквально написал, ничего не пропуская, и это работает, как () пустое выражение.
null тоже может являться шаблоном. Имхо, главное чтобы обрабатывался такой шаблон корректно, а уж за смысловой нагрузкой регулярки пусть пользователь следит.
Posted: Fri Jan 17, 2014 1:26 pm
by Drugmix
YuS
https://gist.github.com/Drugoy/02d9d29c757e5e5ef031
но вообще, написать тесты совсем на все случаи жизни - невозможно, т.к. там где в аргументе используется `, или `n - подразумевается, что их может быть сколь угодно много и в любом сочетании с прочим текстом в этом аргументе.
Posted: Fri Jan 17, 2014 9:01 pm
by YuS
Drugmix wrote:
но вообще, написать тесты совсем на все случаи жизни - невозможно
Согласен, но однако, написать регулярку для раскраски незнакомого синтаксиса без тестового массива ещё невозможнее.
Drugmix wrote:
, т.к. там где в аргументе используется `, или `n - подразумевается, что их может быть сколь угодно много и в любом сочетании с прочим текстом в этом аргументе.
В данном случае, проблема даже не в этом, тут проблема в слишком вольном синтаксисе - судя по тестовому массиву, мало того, что разделителем аргументов может быть и пробел, и запятая, так ещё и разделителем частей аргументов могут быть те же самые символы, а это уже перебор.
В общем, с учетом того, что:
1. Аргументов должно быть не более двух.
2. Разделителем частей аргументов не может являться
неэкранированная запятая и пробел (если они будут экранированными, тогда будет 100% раскраска).
3. На двух идущих подряд экранированных символах раскраска поломается (возможно, что этот момент можно победить, надо пораскинуть мозгами, но я уже пас)
Code: Select all
0 "^\s*(?:(Else)(?:\s*,\s*|\s+)|(Try)(?:\s*,\s*|\s+)|([^:]{1,38}(?=::))::)*\s*(#IfWinActive\b)\s*?,?\s*?([^;,`\s]+(?!`.)|[^`,\s;]+`.)*\s*?,?\s*?([^;,`\s]+(?!`.)|[^`,\s;]+`.)*\s*?,?\s*?(\s+;.*)?$" `\1=(4,${OP},0) \2=(4,${IF},0) \3=(2,${STR},0) \4=(2,${TYPE},0) \5=(2,${ATTR},#ff0000) \6=(2,${ATTR},#00ff00) \7=(3,${COMM},0)`
Posted: Sat Jan 18, 2014 12:04 am
by Drugmix
По правилам синтаксиса ahk:
1. Только первый аргумент можно писать через пробел от команды, пропустив запятую.
2. Каждая экранированная запятая - не считается разделителем.
Ваше правило всем хорошо, кроме того, что
а. ломается на пробеле в 1 из аргументов (а если это исправить, то поломаются строки с комментарием в конце.
б. ломается на двух идущих подряд экранированных символах
в. при наличии ` без в конце аргумента.
Всё остальное - правильно.
Что ж, вот он и предел, до тех пор, пока Instructor не изменит парсер RegEx на более соответствующие PCRE.
Posted: Sat Jan 18, 2014 4:16 am
by YuS
Drugmix wrote:По правилам синтаксиса ahk:
1. Только первый аргумент можно писать через пробел от команды, пропустив запятую.
Так это может в корне поменять подход к написанию регулярки. Если я правильно понял, то пробел не может являться разделителем самих аргументов? Если так, то в массиве с валидными строками это правило нарушено...
Drugmix wrote:
2. Каждая экранированная запятая - не считается разделителем.
Этот момент учтен, там вообще любой экранированный символ считается частью аргумента.
Drugmix wrote:
Ваше правило всем хорошо, кроме того, что
а. ломается на пробеле в 1 из аргументов (а если это исправить, то поломаются строки с комментарием в конце.
Этот момент зависит от ответа на вопрос о валидных разделителях аргументов, т.е. можно попытаться исправить ситуацию, но при условии более строгого синтаксиса в отношении разделителей.
Drugmix wrote:
б. ломается на двух идущих подряд экранированных символах
Это я оговорил - на первый взгляд эту проблему трудновато обойти, но попытаться можно...
Drugmix wrote:
в. при наличии ` без в конце аргумента.
Если символ экранирования "`" присутствует в конце аргумента, то значит последующий символ экранируется и является частью аргумента, т.е. при наличии комментария в строке, последующий комментарий не выдерживает условия наличия пробела перед ";", так что всё правильно, а в случае отсутствия комментария - ничего не ломается. Или таки символ экранирования может принимать другие значения, кроме, собственно, экранирования? Если да, то такую неоднозначность трудно обработать, если вообще возможно...
Drugmix wrote:
Что ж, вот он и предел, до тех пор, пока Instructor не изменит парсер RegEx на более соответствующие PCRE.
Ну, не совсем так. Движок по регуляркам, пока достаточно точно соответствует PCRE, за исключением некоторых особенностей, но это скорее необходимость, чем прихоть. Единственный момент - очень не хватает поиска по условию, с ним было бы гораздо проще в написании регулярок...