Регулярные выражения

Russian main discussion
  • Author
  • Message
Offline
Posts: 294
Joined: Tue Jul 27, 2010 11:18 pm

Post by Serge Yolkin »

Instructor
Да, похоже, поторопился... Но и с вновь скачанной беда:

Code: Select all

^[^d]\S+(?!.*\=)
"Прекращена работы программы" и из поиска, и из QSearch. На стабильной и всех тестовых. Забавно: ^[^\d] в начале не приводит к проблеме (забавно то, что слэш я просто пропустил :) )

Ага! К проблеме приводит ещё

Code: Select all

^[^\d]+(?!.*\=)
И ещё: при том, что я не против демократии (?<=) и (?<=|) по-моему, всё-таки, снтаксическая ошибка. Хотя, можно прикинуть как это использовать :)
Last edited by Serge Yolkin on Fri Jan 17, 2014 6:11 am, edited 1 time in total.

YuS
Offline
Posts: 512
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

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

YuS
Offline
Posts: 512
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

Serge Yolkin wrote:Instructor
И ещё: при том, что я не против демократии (?<=) и (?<=|) по-моему, всё-таки, снтаксическая ошибка. Хотя, можно прикинуть как это использовать :)
Отчего же ошибка? Вполне описано в PCRE
(?<= шаблон) - positive lookbehind

Offline
Posts: 122
Joined: Sat Mar 19, 2011 10:20 pm

Post by DrakonHaSh »

подскажите плиз как в данный момент лучше всего искать регулярку в строке ?
привычное ^.*==.*$ и ^.*?==.*?$ не работает :(
непривычное \n.*?==.*?\n и \r\n.*?==.*?\r\n тоже не работает
в документации ответа на этот элементарный вопрос не нашел ::(

Offline
Posts: 582
Joined: Mon Apr 08, 2013 9:50 pm
Location: Win7SP1x64, APx64

Post by Drugmix »

YuS
там, где подсвечивается MButton:: значит не подсвечиваются либо строки с ` без запятой после неё, либо с аргументом из двух слов, либо с комментарием в конце строки, либо с Else,Try.

Offline
Posts: 294
Joined: Tue Jul 27, 2010 11:18 pm

Post by Serge Yolkin »

YuS
=шаблон, а шаблона нет. Я буквально написал, ничего не пропуская, и это работает, как () пустое выражение.

DrakonHaSh
Э-э-э... А привычное из какого языка? Я про == не очень понял.

Offline
Posts: 122
Joined: Sat Mar 19, 2011 10:20 pm

Post by DrakonHaSh »

Serge Yolkin wrote:YuS
=шаблон, а шаблона нет. Я буквально написал, ничего не пропуская, и это работает, как () пустое выражение.

DrakonHaSh
Э-э-э... А привычное из какого языка? Я про == не очень понял.
==
это то, что я искал - для примера. т.е. найти строки в которых содержится "==".

Offline
Posts: 582
Joined: Mon Apr 08, 2013 9:50 pm
Location: Win7SP1x64, APx64

Post by Drugmix »

DrakonHaSh
а по какому признаку отделять регулярку в строке от строки без регулярки?
По Вашей регулярке похоже, что она скорей для каких-то присваиваний, типа var == 9.

Offline
Posts: 122
Joined: Sat Mar 19, 2011 10:20 pm

Post by DrakonHaSh »

Drugmix wrote:DrakonHaSh
а по какому признаку отделять регулярку в строке от строки без регулярки?
По Вашей регулярке похоже, что она скорей для каких-то присваиваний, типа var == 9.
вот жеж я неудачный пример придумал видимо ))
пофик что искать - абы оно было на одной строке.

тут пример написал
http://www.phpliveregex.com/p/36S + перейти на вкладку справа preg_match_all

YuS
Offline
Posts: 512
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

DrakonHaSh wrote: привычное ^.*==.*$ и ^.*?==.*?$ не работает :(

Code: Select all

^[^\n]*?==[^\n]*?$
Drugmix wrote: там, где подсвечивается MButton:: значит не подсвечиваются либо строки с ` без запятой после неё, либо с аргументом из двух слов, либо с комментарием в конце строки, либо с Else,Try.
В массив возможных вариантов добавьте все возможные варианты.
Чуть выше я ссылку давал на файлы, там есть файл с предложенными Вами вариантами, в которых эти именно отсутствуют.

YuS
Offline
Posts: 512
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

Serge Yolkin wrote:YuS
=шаблон, а шаблона нет. Я буквально написал, ничего не пропуская, и это работает, как () пустое выражение.
null тоже может являться шаблоном. Имхо, главное чтобы обрабатывался такой шаблон корректно, а уж за смысловой нагрузкой регулярки пусть пользователь следит.

Offline
Posts: 582
Joined: Mon Apr 08, 2013 9:50 pm
Location: Win7SP1x64, APx64

Post by Drugmix »

YuS
https://gist.github.com/Drugoy/02d9d29c757e5e5ef031
но вообще, написать тесты совсем на все случаи жизни - невозможно, т.к. там где в аргументе используется `, или `n - подразумевается, что их может быть сколь угодно много и в любом сочетании с прочим текстом в этом аргументе.

YuS
Offline
Posts: 512
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post 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)`

Offline
Posts: 582
Joined: Mon Apr 08, 2013 9:50 pm
Location: Win7SP1x64, APx64

Post by Drugmix »

По правилам синтаксиса ahk:
1. Только первый аргумент можно писать через пробел от команды, пропустив запятую.
2. Каждая экранированная запятая - не считается разделителем.

Ваше правило всем хорошо, кроме того, что
а. ломается на пробеле в 1 из аргументов (а если это исправить, то поломаются строки с комментарием в конце.
б. ломается на двух идущих подряд экранированных символах
в. при наличии ` без в конце аргумента.
Всё остальное - правильно.
Что ж, вот он и предел, до тех пор, пока Instructor не изменит парсер RegEx на более соответствующие PCRE.

YuS
Offline
Posts: 512
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

Drugmix wrote:По правилам синтаксиса ahk:
1. Только первый аргумент можно писать через пробел от команды, пропустив запятую.
Так это может в корне поменять подход к написанию регулярки. Если я правильно понял, то пробел не может являться разделителем самих аргументов? Если так, то в массиве с валидными строками это правило нарушено...
Drugmix wrote: 2. Каждая экранированная запятая - не считается разделителем.
Этот момент учтен, там вообще любой экранированный символ считается частью аргумента.
Drugmix wrote: Ваше правило всем хорошо, кроме того, что
а. ломается на пробеле в 1 из аргументов (а если это исправить, то поломаются строки с комментарием в конце.
Этот момент зависит от ответа на вопрос о валидных разделителях аргументов, т.е. можно попытаться исправить ситуацию, но при условии более строгого синтаксиса в отношении разделителей.
Drugmix wrote: б. ломается на двух идущих подряд экранированных символах
Это я оговорил - на первый взгляд эту проблему трудновато обойти, но попытаться можно...
Drugmix wrote: в. при наличии ` без в конце аргумента.
Если символ экранирования "`" присутствует в конце аргумента, то значит последующий символ экранируется и является частью аргумента, т.е. при наличии комментария в строке, последующий комментарий не выдерживает условия наличия пробела перед ";", так что всё правильно, а в случае отсутствия комментария - ничего не ломается. Или таки символ экранирования может принимать другие значения, кроме, собственно, экранирования? Если да, то такую неоднозначность трудно обработать, если вообще возможно...
Drugmix wrote: Что ж, вот он и предел, до тех пор, пока Instructor не изменит парсер RegEx на более соответствующие PCRE.
Ну, не совсем так. Движок по регуляркам, пока достаточно точно соответствует PCRE, за исключением некоторых особенностей, но это скорее необходимость, чем прихоть. Единственный момент - очень не хватает поиска по условию, с ним было бы гораздо проще в написании регулярок...
Post Reply