Регулярные выражения
- Author
- Message
-
Offline
- Posts: 294
- Joined: Tue Jul 27, 2010 11:18 pm
-
Offline
- Posts: 582
- Joined: Mon Apr 08, 2013 9:50 pm
- Location: Win7SP1x64, APx64
Ваше правило у меня окрасило 0 из 246 тестовых строк, которые должны были окраситься, но:YuS wrote:Как-то так:Code: Select all
0 "^\s*(?:(Try)?(Else)?(?:\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,${OP},0) \5=(2,${ATTR},#ff0000) \6=(2,${ATTR},#00ff00) \7=(3,${COMM},0)`
Во-первых, спасибо за Вашу помощь.
Во-вторых, я и не знал, что можно внутри незахватывающей группы (?:smth) захватить что-то другой группой. Оказывается можно, а без Вашей помощи я бы не скоро об этом узнал, спасибо.
В связи с этим новым для меня знанием, я:
а. теперь могу переделать правила так, чтобы группы подсветки в них шли по порядку от 1 до n, что очень облегчает навигацию по ним;
б. переделал левую часть правила чуть правильней, чем у Вас и добавил учёт ещё одного валидного варианта употребления, о существовании которого раньше я не подозревал, который бы тоже надо было раскрашивать: Else,Try,Command,arg.
теперь левая часть правила выглядит так:
Code: Select all
0 "^\s*(?:(Else(?:\s*,\s*|\s+))?(Try(?:\s*,\s*|\s+))?|(.{1,38}(?=::))(?:::))?
что означают 2 знака вопроса идущие подряд?
Code: Select all
(?:\s*?,\s*?|\s*?)??
В таком виде
Code: Select all
0 "^\s*(?:(Else(?:\s*,\s*|\s+))?(Try(?:\s*,\s*|\s+))?|(.{1,38}(?=::))(?:::))?(#IfWinActive\b)(?:\s*,\s*?|\s+?)?([^,`\s]*(?!`,)|(?:[^`,\s]*(?:`,)?)*)?(?:\s*?,\s*?)?([^,`\s]*(?!`,)|(?:[^`,\s]*(?:`,)?)*)?(\s+;.*)?$" `\6=(4,${OP},0) \2=(4,${IF},0) \3=(2,${STR},0) \4=(2,${OP},0) \5=(2,${ATTR},#ff0000) \6=(2,${ATTR},#00ff00) \7=(3,${COMM},0)`
-
Offline
- Site Admin
- Posts: 6403
- Joined: Thu Jul 06, 2006 7:20 am
Serge Yolkin wrote:Это только для [^...]?
AkelHelp-Rus.htm wrote:- Квантификаторы регулярных выражений (*, +, {n,}) являются по умолчанию жадными (кроме одинарной точки, например, ".*" или ".{5,10}"). Чтобы сделать их нежадными (старый принцип), используется "?" после квантификатора, например, "\d*?".
- Жадные регулярные выражения AkelPad'а выполняются последовательно. Например, шаблон "ab?b" в "abc" не имеет совпадений, т.к. "ab?" соответствует "ab" и последующее "b" не имеет совпадений. Корректный шаблон, в данном случае, будет "abb?".
Проверяйте шаблон на возможное наличие ошибки в диалоге поиска/замены .Serge Yolkin wrote:В последней тестовой сломалась подсветка в одном из моих оригинальных файлов hta.coder.
Last edited by Instructor on Wed Jan 15, 2014 7:39 pm, edited 1 time in total.
-
Offline
- Posts: 294
- Joined: Tue Jul 27, 2010 11:18 pm
Instructor, да, спасибо, косяк со своей жадностью... вернее свой косяк с жадностью я уже понял - почитал справку...
Перестали работать ранее работавшие правила (и в QSearch тоже)
Перестали работать ранее работавшие правила (и в QSearch тоже)
Code: Select all
4 `(</?)([a-z]+\:)?([a-z][\w\-]*(?=(\s|(/?>)|$)))` `\1=(2,${TAG},0) \2=(2,${IF},0) \3=(2,${TAG},0)`
;> атрибуты тэгов
4 `\b(xmlns)(\:[\w\-]+)\b` `\1=(0,${ATTR},0) \2=(0,${IF},0)`
4 `\b(\w+\:)?([\w\-]+)(?=\=")` `\1=(0,${IF},0) \2=(0,${ATTR},0)`
-
Offline
- Posts: 513
- Joined: Sun Sep 15, 2013 8:25 am
- Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы
Ну, не знаю, возможно у нас разные версии AP и плагина или Вы скопировали только шаблон регулярки, без обратных ссылок подсветки. У меня использовался релиз AP 4.8.6 и крайняя версия Coder от 12.01.14:Drugmix wrote: Ваше правило у меня окрасило 0 из 246 тестовых строк, которые должны были окраситься

- все Ваши вышеоговоренные условия (в частности, по тестовому файлу - SHOULD WORK и SHOULD FAIL, а также из этого поста) выполнены и раскраска присутствует по всем строкам из Вашего тестового набора. На всякий случай для проверки: файлы - для чистоты эксперимента из ahk.coder удалена подсветка операторов и оставлена только регулярка QuotesRE.
Не критично, но вряд ли это правильнее, ведь, по сути, одно и то же действие выполняется дважды "(?:\s*,\s*|\s+)"...Drugmix wrote: б. переделал левую часть правила чуть правильней, чем у Вас и добавил учёт ещё одного валидного варианта употребления, о существовании которого раньше я не подозревал, который бы тоже надо было раскрашивать: Else,Try,Command,arg.
теперь левая часть правила выглядит так:Code: Select all
0 "^\s*(?:(Else(?:\s*,\s*|\s+))?(Try(?:\s*,\s*|\s+))?|(.{1,38}(?=::))(?:::))?
Да, это самый обычный ленивый квантификатор. Без него не захватываются подобные строки:Drugmix wrote: В третьих, есть вопрос по остальной части Вашего правила:
что означают 2 знака вопроса идущие подряд?"откусить такой-то кусок, но совсем-совсем не жадно"?Code: Select all
(?:\s*?,\s*?|\s*?)??
Code: Select all
#IfWinActive ; comm
и если пробел после #IfWinActive захватывается "(?:\s*?,\s*?|\s*?)?", то не выполнится условие "(\s+;.*)?" и строка, естественно, не будет подсвечена.наличие строчного комментария, который должен начинаться с любого пробельного символа и идущей за ним точкой с запятой.
В моем варианте окрашиваются все 100% из Вашего тестового набора... может быть у меня набор не полный?Drugmix wrote: правило окрашивает достаточно много строк, кроме некоторых весьма типичных. Надеюсь, что смогу догнать до прохода 100% тестов.
-
Offline
- Posts: 582
- Joined: Mon Apr 08, 2013 9:50 pm
- Location: Win7SP1x64, APx64
YuS
обновил кодер плагин на 1 версию и видимо, изменения не соответствуют , т.к. всё и правда заработало, удивительно.
А благодаря Вам я теперь знаю про ??
Увы, но Ваши правила ломаются на строке с любым аргументом, содержащим ` без последующей запятой.
А ведь после ` может идти или не идти что угодно. Если ничего не идёт - это считается как опущенный аргумент. Если идёт что-то - то оно конвертируется в другое что-то: `n - символ новой строки, например.
А `; - это экранированная точка с запятой.
обновил кодер плагин на 1 версию и видимо, изменения не соответствуют , т.к. всё и правда заработало, удивительно.
Это как раз необходимо для поддержки новых тестов, про которые я писал в предыдущем сообщении, когда присутствует и else и за ним try.YuS wrote:Не критично, но вряд ли это правильнее, ведь, по сути, одно и то же действие выполняется дважды "(?:\s*,\s*|\s+)"...
знаю, ох как я с этим мучилсяYuS wrote:Да, это самый обычный ленивый квантификатор. Без него не захватываются подобные строки:Code: Select all
#IfWinActive ; comm

А благодаря Вам я теперь знаю про ??
Увы, но Ваши правила ломаются на строке с любым аргументом, содержащим ` без последующей запятой.
А ведь после ` может идти или не идти что угодно. Если ничего не идёт - это считается как опущенный аргумент. Если идёт что-то - то оно конвертируется в другое что-то: `n - символ новой строки, например.
А `; - это экранированная точка с запятой.
-
Offline
- Posts: 513
- Joined: Sun Sep 15, 2013 8:25 am
- Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы
А, ну если так, то да. Просто в изначальном варианте было ((Try)|(Else)), а переделал я эту конструкцию потому, что она смещала обратные ссылки раскраски - всё дело в том, что атомарная группировка выполняется до первого совпадения, т.е. если найдено (Try), то вторая часть (Else) игнорируется и группа не захватывается, и соответственно, номера групп смещаются на единицу...Drugmix wrote: Это как раз необходимо для поддержки новых тестов, про которые я писал в предыдущем сообщении, когда присутствует и else и за ним try.
Угу, этот момент не учитывался и в Вашем тестовом наборе его не было. В общем, верно сказали выше, все нюансы не учтешь, если синтаксис незнаком.Drugmix wrote: Увы, но Ваши правила ломаются на строке с любым аргументом, содержащим ` без последующей запятой.
-
Offline
- Posts: 582
- Joined: Mon Apr 08, 2013 9:50 pm
- Location: Win7SP1x64, APx64
эээ, Смещение происходит только если в вышеобозначенной конструкции использовать \1, я же использовал \2 и \3 для окраски, как раз чтобы разделить их.YuS wrote:А, ну если так, то да. Просто в изначальном варианте было ((Try)|(Else)), а переделал я эту конструкцию потому, что она смещала обратные ссылки раскраски - всё дело в том, что атомарная группировка выполняется до первого совпадения, т.е. если найдено (Try), то вторая часть (Else) игнорируется и группа не захватывается, и соответственно, номера групп смещаются на единицу...
ну, к счастью, похоже, что это не трудно было исправить:YuS wrote: Угу, этот момент не учитывался и в Вашем тестовом наборе его не было. В общем, верно сказали выше, все нюансы не учтешь, если синтаксис незнаком.
достаточно было изменить (?:`,) на (?:`.?).
-
Offline
- Posts: 582
- Joined: Mon Apr 08, 2013 9:50 pm
- Location: Win7SP1x64, APx64
блин, а на последней версии перестали подкрашиваться строки, начинающиеся с MButton:: :-/
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,${IF},0) \2=(4,${OP},0) \3=(2,${STR},0) \4=(2,${OP},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