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

Russian main discussion
  • Author
  • Message
Offline
Posts: 582
Joined: Mon Apr 08, 2013 9:50 pm
Location: Win7SP1x64, APx64

Post by Drugmix »

Instructor
1. Для проблемы 1:

Code: Select all

0   "^(?:(.+(?=::))::)?(#ErrorStdOut)$" "\1=(4,${IF},0) \2=(2,${DEL2},0)"
в новой пустой вкладке написать 2 строки с одинаковым текстом "#errorstdout".
переключиться на какую-то вкладку, а потом обратно на эту с двумя строчками.
Результат:
Image

2. Для проблемы 2:

Code: Select all

0   "^(Click)(,[^,]*)?(,[^,]*+)?(,[^,]*)?$" "\1=(0,${OP},0) \2=(0,${TYPE},#ff0000) \3=(0,${TYPE},#00ff00) \4=(0,${TYPE},#0000ff)"
в новой пустой вкладке написать 2 строки и получить следующий результат:
Image

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

Post by Drugmix »

Заметка по поводу бага 1: похоже, что это завязано на работе памяти, т.к. глюк стабильно воспроизводится/не воспроизводится при 2-ух разных последовательностях действий над файлом .coder, но приводящих к одинаковому итоговому содержимому .coder-файла, после чего вызывалась команда обновления кэша coder-плагина Call("Coder::Settings", 2) и делалось сравнение окраски тех двух строк в соседней вкладке.
Результат был стабилен для каждой из последовательностей действий: в одном случае стабильно воспроизводился баг, а в другом - стабильно не воспроизводился.
Это при том, что кэш в обоих случаях должен был быть одинаковым, ведь команда обновления кэша вызывалась после приведения содержимого .coder-файла к идентичному состоянию.

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

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

Post by Instructor »

1. Не воспроизводится.
Image

2.
"^(Click)(,[^,]*)?+(,[^,]*+)?+(,[^,]*)?+$"

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

Post by YuS »

Drugmix wrote: 2. в этом правиле жадность не слушается:

Code: Select all

0   "^\s*(?:\}\s*)*(?:(Else)(?:\s*,\s*|\s+|\s*\{\s*)|(.+(?=::))::)?(?:(Try)(?:\s*,\s*|\s+|\s*\{\s*))?\s*(Click)(?:(?:\s*,\s*|\s+)([^;,]|(?<=`),|(?<!\s);)*)?(?:\s*+,\s*+([^;,]|(?<=`),|(?<!\s);)*+)?(?:\s*,\s*([^;,]|(?<=`),|(?<!\s);)*)?((?<=\s);.*)?$" "\1=(4,${IF},0) \2=(4,${STR},0) \3=(2,${OP},0) \4=(0,${OP},0) \5=(0,${TYPE},#ff0000) \6=(0,${TYPE},#00ff00) \7=(0,${TYPE},#0000ff) \8=(3,${COMM},0)"
должно в строке "Click,red,green" слово "green" подкрашивать зелёным фоном, а подкрашивает синим. В правиле овер-жадность выставлена как раз для фразы после второй запятой, но её всё равно перебивает под-правило для подкрашивания после третьей запятой, хоть у этого под-правила и не используется овер-жадность и оно бы должно перебиваться соседним под-правилом с овер-жадностью.
Кхм, всё дело в группах и нежадном квантификаторе "?". Проверяться должны все возможные варианты, а из-за того, что группы, по сути не являются жадными (хоть внутри у них и есть жадные квантификаторы), то захват происходит последним совпадающим шаблоном, при прочих равных...
Чтобы добиться желаемого, правило надо модифицировать, примерно так:

Code: Select all

0   "^\s*(?:\}\s*)*(?:(Else)(?:\s*,\s*|\s+|\s*\{\s*)|(.+(?=::))::)?(?:(Try)(?:\s*,\s*|\s+|\s*\{\s*))?\s*(Click)(?:(?:\s*,\s*|\s+)([^;,]|(?<=`),|(?<!\s);)*){,1}+(?:\s*+,\s*+([^;,]|(?<=`),|(?<!\s);)*+){,1}+(?:\s*,\s*([^;,]|(?<=`),|(?<!\s);)*)?((?<=\s);.*)?$" "\1=(4,${IF},0) \2=(4,${STR},0) \3=(2,${OP},0) \4=(0,${OP},0) \5=(0,${TYPE},#ff0000) \6=(0,${TYPE},#00ff00) \7=(0,${TYPE},#0000ff) \8=(3,${COMM},0)"
вместо "{,1}+" вполне сгодится и "?+", но так, имхо, нагляднее...

PS Эмм, а на этой странице уже есть ответ :)... ну да ладно, пусть и этот остается.

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

Post by Drugmix »

Instructor wrote:1. Не воспроизводится.
Image

2.
"^(Click)(,[^,]*)?+(,[^,]*+)?+(,[^,]*)?+$"
2. О, спасибо, всё вроде так работает, пробую кол-во правил увеличить.
1. Это всё завязано на работе кодер-кэша/памяти и я вижу, как иногда он реально "бьётся".
Вот, например, у меня к файлу ahk.coder вдруг почему-то применяются правила из него же (рядом открыт coder.coder и его содержимое практически дефолтное):
Image

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

Post by Drugmix »

где хранится кэш .coder-плагина?
а то иногда ошибка в .coder файле способна перекосоёжить весь акелпад так, что при каждом открытии вот такой баг
Image
а при каждом закрытии (как и при выполнении команды по обновлению кэша кодера) - крэш.

Offline
Posts: 366
Joined: Mon Jan 10, 2011 5:28 pm
Contact:

Post by Lenchik »

в папке с .coder файлами лежит файл cache

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

Post by Drugmix »

Lenchik
это какой-то не тот кэш: там лишь перечислены .coder файлы, какие-то наборы символов (хэш?) и потом перечислены regex шаблоны, по которым к тому или иному файлу должна применяться раскраска из соответствующего .coder-файла.
Что за хэш там?

p.s.: кто-нибудь, проверьте у себя, пожалуйста, работу моего ahk.coder: http://pastebin.com/raw.php?i=9hwfQQWt

Offline
Posts: 1162
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

Drugmix
Вы бы валожили тестовый файл и картинку, как должно быть :)
У себя на 4.9.1 артефактов не вижу, но подсвечивается явно не всё. http://rghost.ru/57951681/image.png
Снизу - Last modification: 2013.08.24 22:40

З.Ы. х64 4.9.0 с Last modification: 2014.02.18 23:20 отрисовал с десяток строчек и повис наглухо с 25 килобайтным файлом, прибил.

Offline
Posts: 173
Joined: Mon Dec 06, 2010 9:53 am
Location: г.Харьков, Русь

Post by San_dr »

х64 4.9.0 с Last modification ahk.coder: 2014.02.18 23:20 у меня пишет

Code: Select all

 "ahk.coder" (смещение 124208) содержит неизвестное имя секции "0".

Offline
Posts: 1162
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

San_dr
А что у вас там? В StatusUserFormat можно добавить Поз.: %or. На всех трех версиях с Last modification ahk.coder: 2014.02.18 23:20 (с репозитория) не вижу ничего косячного в этой позиции и поблизости.

У меня просто падет, зато успевает подсветить гораздо больше, чем в х86. Файл, на котором падает, могу выложить.

Не пора ли перебраться в ветку плагина или сразу - багов AkelPad?

Offline
Posts: 173
Joined: Mon Dec 06, 2010 9:53 am
Location: г.Харьков, Русь

Post by San_dr »

я проверял когда у меня был открыт текстовый файл " FAQ " из моей сборки, - просто выбрал для этого файла синтаксическую тему "ahk", после чего последовало озвученное ранее сообщение, а после нажатия на "ОК" в окошке сообщения - новое окно "прекращена работа программы Akelpad, закрыть? искать решение в интернете?" Пришлось переименовать файл, чтобы можно было открыть Акель заново :) и после открытия вернуть прежнее название, и тогда он открылся уже с txt подсветкой и без поблем.

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

Post by Instructor »

Skif_off wrote:Файл, на котором падает, могу выложить.
Не мешало бы.

Offline
Posts: 1162
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

Coder-файл отсюда, 4.9.1х86 (ссылка была на ру-борде) и 4.9.0х64 виснут наглухо и падают (успевают показать 2,5 строки).
Описание ошибки, на всякий случай оба:

Code: Select all

Описание:
  Ошибка привела к остановке взаимодействия программы с Windows.

Сигнатура проблемы:
  Имя события проблемы:	AppHangB1
  Имя приложения:	AkelPad.exe
  Версия приложения:	4.9.1.0
  Отметка времени приложения:	54105069
  Сигнатура зависания:	e50a
  Тип зависания:	0
  Версия ОС:	6.1.7601.2.1.0.256.48
  Код языка:	1049
  Доп. сигнатура зависания 1:	e50a7939656a00dd6829a2228c55c5d2
  Доп. сигнатура зависания 2:	b7ec
  Доп. сигнатура зависания 3:	b7ec6f350631d93d90340ce743a9809f
  Доп. сигнатура зависания 4:	e50a
  Доп. сигнатура зависания 5:	e50a7939656a00dd6829a2228c55c5d2
  Доп. сигнатура зависания 6:	b7ec
  Доп. сигнатура зависания 7:	b7ec6f350631d93d90340ce743a9809f
и

Code: Select all

Описание:
  Ошибка привела к остановке взаимодействия программы с Windows.

Сигнатура проблемы:
  Имя события проблемы:	AppHangB1
  Имя приложения:	AkelPad.exe
  Версия приложения:	4.9.0.0
  Отметка времени приложения:	540d3102
  Сигнатура зависания:	36c8
  Тип зависания:	0
  Версия ОС:	6.1.7601.2.1.0.256.48
  Код языка:	1049
  Доп. сигнатура зависания 1:	36c8e917af185755b8b71bdea852ba27
  Доп. сигнатура зависания 2:	e2c4
  Доп. сигнатура зависания 3:	e2c4f85aad01755deb848bb4804f6043
  Доп. сигнатура зависания 4:	36c8
  Доп. сигнатура зависания 5:	36c8e917af185755b8b71bdea852ba27
  Доп. сигнатура зависания 6:	e2c4
  Доп. сигнатура зависания 7:	e2c4f85aad01755deb848bb4804f6043


Файл из исходников Quick Cliq (офсайт лежит) http://rghost.ru/57971082

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

Post by Instructor »

Post Reply