Posted: Wed Jan 15, 2014 7:07 pm
Instructor
ОК. Это только для [^...]?
ОК. Это только для [^...]?
Ваше правило у меня окрасило 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)`
Code: Select all
0 "^\s*(?:(Else(?:\s*,\s*|\s+))?(Try(?:\s*,\s*|\s+))?|(.{1,38}(?=::))(?:::))?
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)`
Serge Yolkin wrote:Это только для [^...]?
AkelHelp-Rus.htm wrote:- Квантификаторы регулярных выражений (*, +, {n,}) являются по умолчанию жадными (кроме одинарной точки, например, ".*" или ".{5,10}"). Чтобы сделать их нежадными (старый принцип), используется "?" после квантификатора, например, "\d*?".
- Жадные регулярные выражения AkelPad'а выполняются последовательно. Например, шаблон "ab?b" в "abc" не имеет совпадений, т.к. "ab?" соответствует "ab" и последующее "b" не имеет совпадений. Корректный шаблон, в данном случае, будет "abb?".
Проверяйте шаблон на возможное наличие ошибки в диалоге поиска/замены .Serge Yolkin wrote:В последней тестовой сломалась подсветка в одном из моих оригинальных файлов hta.coder.
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)`
ТестоваяSerge Yolkin wrote:Перестали работать ранее работавшие правила (и в QSearch тоже)
Ну, не знаю, возможно у нас разные версии AP и плагина или Вы скопировали только шаблон регулярки, без обратных ссылок подсветки. У меня использовался релиз AP 4.8.6 и крайняя версия Coder от 12.01.14:Drugmix wrote: Ваше правило у меня окрасило 0 из 246 тестовых строк, которые должны были окраситься
Не критично, но вряд ли это правильнее, ведь, по сути, одно и то же действие выполняется дважды "(?:\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% тестов.
Это как раз необходимо для поддержки новых тестов, про которые я писал в предыдущем сообщении, когда присутствует и else и за ним try.YuS wrote:Не критично, но вряд ли это правильнее, ведь, по сути, одно и то же действие выполняется дважды "(?:\s*,\s*|\s+)"...
знаю, ох как я с этим мучилсяYuS wrote:Да, это самый обычный ленивый квантификатор. Без него не захватываются подобные строки:Code: Select all
#IfWinActive ; comm
А, ну если так, то да. Просто в изначальном варианте было ((Try)|(Else)), а переделал я эту конструкцию потому, что она смещала обратные ссылки раскраски - всё дело в том, что атомарная группировка выполняется до первого совпадения, т.е. если найдено (Try), то вторая часть (Else) игнорируется и группа не захватывается, и соответственно, номера групп смещаются на единицу...Drugmix wrote: Это как раз необходимо для поддержки новых тестов, про которые я писал в предыдущем сообщении, когда присутствует и else и за ним try.
Угу, этот момент не учитывался и в Вашем тестовом наборе его не было. В общем, верно сказали выше, все нюансы не учтешь, если синтаксис незнаком.Drugmix wrote: Увы, но Ваши правила ломаются на строке с любым аргументом, содержащим ` без последующей запятой.
эээ, Смещение происходит только если в вышеобозначенной конструкции использовать \1, я же использовал \2 и \3 для окраски, как раз чтобы разделить их.YuS wrote:А, ну если так, то да. Просто в изначальном варианте было ((Try)|(Else)), а переделал я эту конструкцию потому, что она смещала обратные ссылки раскраски - всё дело в том, что атомарная группировка выполняется до первого совпадения, т.е. если найдено (Try), то вторая часть (Else) игнорируется и группа не захватывается, и соответственно, номера групп смещаются на единицу...
ну, к счастью, похоже, что это не трудно было исправить:YuS wrote: Угу, этот момент не учитывался и в Вашем тестовом наборе его не было. В общем, верно сказали выше, все нюансы не учтешь, если синтаксис незнаком.
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)`