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

Russian main discussion
  • Author
  • Message
Offline
Site Admin
Posts: 6411
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

YuS wrote:Если использовать так...
Так и следует.
Serge Yolkin wrote:... делаю две регулярки:

Code: Select all

4 `(\/(?!\/).*?(\[.*?\]).*?(\[.*?\]).*?[^\\](\\\\)*\/)`	`\1=(3,${TYPE},0)`
;4 `(\/(?!\/).*?((\[.*?\]).*?){2}[^\\](\\\\)*\/)`	`\1=(3,${TYPE},0)`
первая работает, вторая - нет. >>>
См. тестовую.
YuS wrote:Не, на моей версии (релиз 4.8.9 x64) работает некорректно (возможно баг). Вот такая строка:

Code: Select all

0	"(\.)(?!\d|--|-\d)(\w|-)+"	"\1=(0,${DEL2},0) \2=(0,${VAR},0)
подсвечивает точку с цифрой:

Code: Select all

background: rgba(209, 210, 211, .8);
>>>
См. тестовую.
Skif_off wrote:Внезапно перестало работать правило

Code: Select all

1	"(\()(c(a|d)+r)"	"\1=(0,${DEL1},0) \2=(0,${OP},0)"
>>>
См. тестовую.


Изменено: квантификаторы регулярных выражений теперь обладают классической жадностью. Чтобы сделать их сверхжадными (старый принцип), используется "+" после квантификатора, например, "\d*+".

Тестовая

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

Post by Drugmix »

Instructor
а что там с обработкой групп?
0 "^\s*(#IfWin(?:Not)?(?:Active|Exist))((?:\s*,\s*)?((?:[^;,]))*?)?\s*((?<=\s);.*)?$" "\1=(4,${IF},0) \3=(4,${AREA},#ff0000) \4=(3,${COMM},#00ff00)"

нормально окрашивает строки:
Image

а стоит в правило добавить после [^;,] ещё |a
0 "^\s*(#IfWin(?:Not)?(?:Active|Exist))((?:\s*,\s*)?((?:[^;,]|a))*?)?\s*((?<=\s);.*)?$" "\1=(4,${IF},0) \3=(4,${AREA},#ff0000) \4=(3,${COMM},#00ff00)"

как всё ломается:
Image

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

Post by YuS »

Instructor wrote:
YuS wrote:Если использовать так...
Так и следует.
ок, понятно.
Instructor wrote:
YuS wrote:...

Code: Select all

background: rgba(209, 210, 211, .8);
>>>
См. тестовую.
Работает, как и задумано.
Instructor wrote: Изменено: квантификаторы регулярных выражений теперь обладают классической жадностью. Чтобы сделать их сверхжадными (старый принцип), используется "+" после квантификатора, например, "\d*+".
Это отлично! Будет больший простор для полета мысли в составлении регэкспов...

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

Post by Serge Yolkin »

Instructor
Проблема исправлена. Спасибо.

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

Post by Instructor »

Drugmix wrote:...а стоит в правило добавить после [^;,] ещё |a
Тестовая

DV
Offline
Posts: 1294
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

Хотелось бы в документации, описывающей синтаксис регулярных выражений, увидеть комментарий, какие символы можно использовать в наборах символов [], а какие - нет.
Например, вроде бы нельзя использовать \b, \B, \A, \Z, \a, \z - хотя по внешнему виду они ничем не отличаются от тех же \d, \s или \W. (Собственно, именно поэтому и хотелось бы увидеть отдельный комментарий, какие из символов являются "особыми".)
Возможно, есть ещё какие-то нюансы?

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

Post by Drugmix »

Instructor wrote:
Drugmix wrote:...а стоит в правило добавить после [^;,] ещё |a
Тестовая
Не видел этого сообщения (возможно, перед релизом стоило меня тыкнуть в него).

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

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

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

Post by Drugmix »

В новой версии одно сложное правило типа

Code: Select all

0	"^\s*(?:\}\s*)*(?:(Else)(?:\s*,\s*|\s+|\s*\{\s*)|(.+(?=::))::)?(?:(Try)(?:\s*,\s*|\s+|\s*\{\s*))?\s*(#IfWin(?:Not)?(?:Active|Exist))(?:(?:\s*,\s*|\s+)([^;,]|(?<=`),|(?<!\s);)*)?(?:\s*,\s*([^;,]|(?<=`),|(?<!\s);)*)?((?<=\s);.*)?$" "\1=(4,${IF},0) \2=(4,${STR},0) \3=(2,${OP},0) \4=(2,${AREA},0) \5=(0,${ATTR},0) \6=(0,${STR},0) \7=(3,${COMM},0)"
Очень сильно замедляет работу акелпада даже на крохотных файлах в пару строк

Code: Select all

#IfWinActive, WinTitle, WinText
#IfWinActive WinTitle, WinText
#IfWinActive, WinTitle WinText
#IfWinActive, WinTitle, WinText;
#IfWinActive, WinTitle;, WinText;
#IfWinActive, WinTitle;`, WinText;, asd ; comm
Правда окрашивает всё правильно (кроме случаев с вышеописанным багом, когда из-за движения каретки или переключения вкладок текст окрашивается частично или целиком неправильно).
Демо бага: одно и то же правило на одной и той же строке
Image
Image
Image

Ах да, заметка: как видно на скриншотах с багом - текст там иногда окрашивается в зелёный жирный курсив и это ошибочно срабатывает эта часть правила: \1=(4,${IF},0).

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

Post by Instructor »

Drugmix wrote:Очень сильно замедляет работу акелпада даже на крохотных файлах в пару строк
AkelHistory-Rus.txt wrote:Изменено: квантификаторы регулярных выражений теперь обладают классической жадностью. Чтобы сделать их сверхжадными (старый принцип), используется "+" после квантификатора, например, "\d*+".
Сверхжадные квантификаторы работают значительно быстрее, поэтому используем их, где это возможно. А, так как правило работало на предыдущей версии, просто конвертируем их (кроме точки '.', т.к. она не была сверхжадной):
0 "^\s*+(?:\}\s*+)*+...
(кроме случаев с вышеописанным багом, когда из-за движения каретки или переключения вкладок текст окрашивается частично или целиком неправильно)
Признак пересечения в правилах.
Last edited by Instructor on Tue Sep 09, 2014 4:21 am, edited 1 time in total.

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

Post by Drugmix »

Instructor wrote:Сверхжадные квантификаторы работают значительно быстрее, поэтому используем их, где это возможно. А так как правило работало на предыдущей версии, просто конвертируем их (кроме точки '.', т.к. она не была сверхжадной):
0 "^\s*+(?:\}\s*+)*+...
Ок, попробую модифицировать.
Instructor wrote:
(кроме случаев с вышеописанным багом, когда из-за движения каретки или переключения вкладок текст окрашивается частично или целиком неправильно)
Признак пересечения в правилах.
Правило тестировалось одно (все остальные QuotesRE правила были отключены). Или имелись в виду пересечения внутри правила?

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

Post by Instructor »

Drugmix
Сверхжадные квантификаторы работают атомарно, поэтому возможностей для пересечения внутри правила меньше.

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

Post by Drugmix »

Да, проверил на одном исправленном правиле - всё многократно ускорилось, спасибо.

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

Post by Drugmix »

Instructor
А в чём дело в работе этих аналогичных правил?

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)"
и

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)"
Оба они срабатывают вот так:
Image
В то время как хочется добиться такого окрашивания, чтобы во второй строке - всё, что окрашено синим было бы окрашено зелёным.

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

Post by Drugmix »

Я всячески наигрался с жадностью:
1. баг с
Image
Image
Image
происходит постоянно: например, при переключении вкладок. Баг появляется даже при одном QuotesRE правиле. Управление жадностью квантификаторов никак не повлияло на частоту появления бага.
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" подкрашивать зелёным фоном, а подкрашивает синим. В правиле овер-жадность выставлена как раз для фразы после второй запятой, но её всё равно перебивает под-правило для подкрашивания после третьей запятой, хоть у этого под-правила и не используется овер-жадность и оно бы должно перебиваться соседним под-правилом с овер-жадностью.

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

Post by Instructor »

Drugmix
Укажите минимальные регулярные выражения демострирующие описанные проблемы.
Post Reply