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

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

Post by Serge Yolkin »

Instructor
ОК. Это только для [^...]?

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

Post by Serge Yolkin »

В последней тестовой сломалась подсветка в одном из моих оригинальных файлов hta.coder. Не смертельно. Подожду релиза, потом поправлю. Возможно, я где-то использовал баг, как фичу :)

Кто использует стандартный html.coder, проверьте, пожалуйста, последнюю тестовую на предмет подсветки тегов.

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

Post by Drugmix »

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)`
Ваше правило у меня окрасило 0 из 246 тестовых строк, которые должны были окраситься, но:
Во-первых, спасибо за Вашу помощь.
Во-вторых, я и не знал, что можно внутри незахватывающей группы (?: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)`
правило окрашивает достаточно много строк, кроме некоторых весьма типичных. Надеюсь, что смогу догнать до прохода 100% тестов.

Offline
Site Admin
Posts: 6403
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

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

Post by Serge Yolkin »

Instructor, да, спасибо, косяк со своей жадностью... вернее свой косяк с жадностью я уже понял - почитал справку...

Перестали работать ранее работавшие правила (и в 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
Site Admin
Posts: 6403
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Serge Yolkin wrote:Перестали работать ранее работавшие правила (и в QSearch тоже)
Тестовая

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

Post by Serge Yolkin »

Instructor
Не-а. Если предыдущей не нравилось ...\-], то теперь [a-z] вообще не работает - Syntax error. (в диалоге замены)

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

Post by YuS »

Drugmix wrote: Ваше правило у меня окрасило 0 из 246 тестовых строк, которые должны были окраситься
Ну, не знаю, возможно у нас разные версии AP и плагина или Вы скопировали только шаблон регулярки, без обратных ссылок подсветки. У меня использовался релиз AP 4.8.6 и крайняя версия Coder от 12.01.14:
Image
- все Ваши вышеоговоренные условия (в частности, по тестовому файлу - SHOULD WORK и SHOULD FAIL, а также из этого поста) выполнены и раскраска присутствует по всем строкам из Вашего тестового набора. На всякий случай для проверки: файлы - для чистоты эксперимента из ahk.coder удалена подсветка операторов и оставлена только регулярка QuotesRE.
Drugmix wrote: б. переделал левую часть правила чуть правильней, чем у Вас и добавил учёт ещё одного валидного варианта употребления, о существовании которого раньше я не подозревал, который бы тоже надо было раскрашивать: Else,Try,Command,arg.
теперь левая часть правила выглядит так:

Code: Select all

0	"^\s*(?:(Else(?:\s*,\s*|\s+))?(Try(?:\s*,\s*|\s+))?|(.{1,38}(?=::))(?:::))?
Не критично, но вряд ли это правильнее, ведь, по сути, одно и то же действие выполняется дважды "(?:\s*,\s*|\s+)"...
Drugmix wrote: В третьих, есть вопрос по остальной части Вашего правила:
что означают 2 знака вопроса идущие подряд?

Code: Select all

(?:\s*?,\s*?|\s*?)??
"откусить такой-то кусок, но совсем-совсем не жадно"?
Да, это самый обычный ленивый квантификатор. Без него не захватываются подобные строки:

Code: Select all

#IfWinActive ; comm 
Тут вся проблема в условии:
наличие строчного комментария, который должен начинаться с любого пробельного символа и идущей за ним точкой с запятой.
и если пробел после #IfWinActive захватывается "(?:\s*?,\s*?|\s*?)?", то не выполнится условие "(\s+;.*)?" и строка, естественно, не будет подсвечена.
Drugmix wrote: правило окрашивает достаточно много строк, кроме некоторых весьма типичных. Надеюсь, что смогу догнать до прохода 100% тестов.
В моем варианте окрашиваются все 100% из Вашего тестового набора... может быть у меня набор не полный?

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

Post by Drugmix »

YuS
обновил кодер плагин на 1 версию и видимо, изменения не соответствуют
:
Added: parameter -2 of external call with code 4 - find selected text marks (Coder::HighLight).
, т.к. всё и правда заработало, удивительно.
YuS wrote:Не критично, но вряд ли это правильнее, ведь, по сути, одно и то же действие выполняется дважды "(?:\s*,\s*|\s+)"...
Это как раз необходимо для поддержки новых тестов, про которые я писал в предыдущем сообщении, когда присутствует и else и за ним try.
YuS wrote:Да, это самый обычный ленивый квантификатор. Без него не захватываются подобные строки:

Code: Select all

#IfWinActive ; comm 
знаю, ох как я с этим мучился :)
А благодаря Вам я теперь знаю про ??

Увы, но Ваши правила ломаются на строке с любым аргументом, содержащим ` без последующей запятой.
А ведь после ` может идти или не идти что угодно. Если ничего не идёт - это считается как опущенный аргумент. Если идёт что-то - то оно конвертируется в другое что-то: `n - символ новой строки, например.
А `; - это экранированная точка с запятой.

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

Post by Serge Yolkin »

Drugmix
Все нюансы синтаксиса может учесть только тот, кто владеет языком...

Offline
Site Admin
Posts: 6403
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Serge Yolkin
CRC AkelPad.exe должно быть 95DC2D00. Видимо, вы успели скачать до того, как архив был обновлен.

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

Post by YuS »

Drugmix wrote: Это как раз необходимо для поддержки новых тестов, про которые я писал в предыдущем сообщении, когда присутствует и else и за ним try.
А, ну если так, то да. Просто в изначальном варианте было ((Try)|(Else)), а переделал я эту конструкцию потому, что она смещала обратные ссылки раскраски - всё дело в том, что атомарная группировка выполняется до первого совпадения, т.е. если найдено (Try), то вторая часть (Else) игнорируется и группа не захватывается, и соответственно, номера групп смещаются на единицу...
Drugmix wrote: Увы, но Ваши правила ломаются на строке с любым аргументом, содержащим ` без последующей запятой.
Угу, этот момент не учитывался и в Вашем тестовом наборе его не было. В общем, верно сказали выше, все нюансы не учтешь, если синтаксис незнаком.

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

Post by Drugmix »

YuS wrote:А, ну если так, то да. Просто в изначальном варианте было ((Try)|(Else)), а переделал я эту конструкцию потому, что она смещала обратные ссылки раскраски - всё дело в том, что атомарная группировка выполняется до первого совпадения, т.е. если найдено (Try), то вторая часть (Else) игнорируется и группа не захватывается, и соответственно, номера групп смещаются на единицу...
эээ, Смещение происходит только если в вышеобозначенной конструкции использовать \1, я же использовал \2 и \3 для окраски, как раз чтобы разделить их.
YuS wrote: Угу, этот момент не учитывался и в Вашем тестовом наборе его не было. В общем, верно сказали выше, все нюансы не учтешь, если синтаксис незнаком.
ну, к счастью, похоже, что это не трудно было исправить:
достаточно было изменить (?:`,) на (?:`.?).

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

Post by Drugmix »

блин, а на последней версии перестали подкрашиваться строки, начинающиеся с 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

Post by Drugmix »

нет, всё-таки, похоже, что при нынешней системе невозможно составить правильное правило для раскраски тех строк, что я пытаюсь.
либо правило ломается на аргументе состоящем из двух слов, либо на строке с комментарием в конце.
+ почему-то на mbutton::
Post Reply