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

Russian main discussion
  • Author
  • Message
Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

Instructor
Все равно виснет, только успевает показать больше строк - десятка полтора.

Code: Select all

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

Сигнатура проблемы:
  Имя события проблемы:	AppHangB1
  Имя приложения:	AkelPad.exe
  Версия приложения:	4.9.1.0
  Отметка времени приложения:	5413570f
  Сигнатура зависания:	4493
  Тип зависания:	0
  Версия ОС:	6.1.7601.2.1.0.256.48
  Код языка:	1049
  Доп. сигнатура зависания 1:	449372ca9f28b7848783bf8964514e82
  Доп. сигнатура зависания 2:	ddc1
  Доп. сигнатура зависания 3:	ddc172ecc60f38a4ce00cadeaa736c96
  Доп. сигнатура зависания 4:	4493
  Доп. сигнатура зависания 5:	449372ca9f28b7848783bf8964514e82
  Доп. сигнатура зависания 6:	ddc1
  Доп. сигнатура зависания 7:	ddc172ecc60f38a4ce00cadeaa736c96

Не совсем понял: в чем суть теста? AkelPad не должен падать в любом случае?

З.Ы. В QuotesRE 189 правил, однако...

Добавлено:
Опять гоню, успел откатиться на Last modification: 2014.01.11 20:20 и поленился сливать - взял крайнюю версию из репозитория. С версией отсюда вроде нормально.

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

Post by Instructor »

Skif_off wrote:AkelPad не должен падать в любом случае?
Да. Не совсем понял - было ли падение с последней тестовой версией? Если было, то какие условия были сопутствующими?

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

Post by Skif_off »

Instructor
С этим файлом падает.

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

Post by Lenchik »

Я так пониманию, что на текущий момент с этим файлом падают все версии 4.9.0+, из-за того что правила жадности регекспов поменялись.
У меня на тестовом файле крепко подвисают Акелы 4.9.0 и этот тестовый Акель.

Code: Select all

^!#z::                  ; Ctrl + Alt + Win + Z
Run  C:\myuser\bin\putty.exe -load oh_shit
Run  C:\myuser\bin\oh_shit.ahk
WinActivate, oh-shit
Sleep, 1000     ;millaseconds
SendInput, myuser{Enter}
Sleep, 1000
SendInput, mypassword{enter}
Sleep, 1000
SendInput, rm -rf /incriminating/evidence/stored/here/
Sleep, 100
SendInput, echo “They have a warrant! Follow purge protocol!” | mail -s “Feds have Arrived!” <a href="mailto:rat@soldierx.com">rat@soldierx.com</a> 
return
; The C:\myuser\bin\oh_shit.ahk file 
; Starts the THEY ARE HERE process

C:\myuser\bin\truecrypt.exe /f /d       ;forces all encrypted volumes to dismount
Run <a href="http://www.somewhitehatpage.com<br />
Run" title="www.somewhitehatpage.com<br />
Run">www.somewhitehatpage.com<br />
Run</a> <a href="http://www.welove-thefeds.com<br />
Run" title="www.welove-thefeds.com<br />
Run">www.welove-thefeds.com<br />
Run</a> del /F \myuser\bin\oh_shit.ahk 
Run C:\myuser\bin\Eraser.exe 
return

Xbutton2::
IfWinActive, Create Blog Entry | Soldierx.com 
{
   SendInput, Nobody can stop information insemination 
}
else
{
   return
}

NumpadIns::             ; Number pad 0 when num lock off
WinActivate, Oracle     ; Activates Virtual box
NumpadEnd::             ; Number pad 1 when num lock off
WinActivate, sx-note    ; this tutorial

F3::            ; F3 key
IfWinNotExist "session_title1"
Run C:\myuser\bin\putty.exe -load "putty_session1"
IfWinNotExist "session_title2"
Run C:\myuser\bin\putty.exe -load "putty_session2"
IfWinNotExist "session_title3"
Run C:\myuser\bin\putty.exe -load "putty_session3"

WinActivate, "session_title1"
        Sleep, 100      ;millaseconds
        SendInput, myuser{Enter}
        Sleep, 100
        SendInput, mypassword{enter}
WinActivate, "session_title2"
        Sleep, 100      ;millaseconds
        SendInput, myuser{Enter}
        Sleep, 100
        SendInput, mypassword{enter}
WinActivate, "session_title3"
        Sleep, 100      ;millaseconds
        SendInput, myuser{Enter}
        Sleep, 100
        SendInput, mypassword{enter}
return

#s::            ; windows key + s 
IfWinNotExist "session_title"
Run C:\myuser\bin\putt.exe -load putty_session
WinActivate, "session_title"
Sleep, 1000     ;millaseconds
SendInput, myuser{Enter}
Sleep, 1000
SendInput, mypassword{enter}
return

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

Post by Drugmix »

Lenchik
зависит от правил в ahk.coder. С моим текущим файлом - не падает.

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

Post by Instructor »

Skif_off wrote:С этим файлом падает.
Тестовая

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

Post by Skif_off »

Instructor
Вертикальной прокруткой прокрутил файл вниз-вверх и AkelPad завис, при попытке закрыть -

Code: Select all

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

Сигнатура проблемы:
  Имя события проблемы:	AppHangB1
  Имя приложения:	AkelPad.exe
  Версия приложения:	4.9.1.0
  Отметка времени приложения:	5415e16e
  Сигнатура зависания:	6042
  Тип зависания:	0
  Версия ОС:	6.1.7601.2.1.0.256.48
  Код языка:	1049
  Доп. сигнатура зависания 1:	6042ffbf9b0e7fde3b118b2538a03518
  Доп. сигнатура зависания 2:	d3c6
  Доп. сигнатура зависания 3:	d3c6e11a77d25627d30d75aa03fa0bf4
  Доп. сигнатура зависания 4:	6042
  Доп. сигнатура зависания 5:	6042ffbf9b0e7fde3b118b2538a03518
  Доп. сигнатура зависания 6:	d3c6
  Доп. сигнатура зависания 7:	d3c6e11a77d25627d30d75aa03fa0bf4
.
Может быть, ладно с ним? :) Случай, кажется, слишком частный, Drugmix рано или поздно внесет изменения.

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

Post by Drugmix »

Skif_off
а я уже внёс :)
С ahk.coder с гитхаба по той ссылке - у меня пока ничего не падает, правда там все самые сложные случаи подсветки (почти всё, кроме команд) - закомментировано, но я потихоньку и эти правила пилю.

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

Post by Drugmix »

Если хочется побороться с падениями, то вот, например, правило под старый парсер:

Code: Select all

0	`"((?:[^"]*?(?:"")?)*?)"` `\1=(0,${STR},0)`
которое способно сейчас положить акелпад на файле с длинными строками, содержащими множественные кавычки, например на этом, если его быстро поскроллить туда-сюда.

Приведение правила к виду

Code: Select all

0	`(")((?:[^"]|"")*+)(")` `\1=(0,${DEL1},0) \2=(0,${STR},0) \3=(0,${DEL1},0)`
решает проблему падений.

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

Post by Serge Yolkin »

В принципе, проблема уже решена в последней тестовой, но интересно другое. В релизе 4.9.0 выражение

Code: Select all

Go(T*o*)*
завешивало Акел на файле, содержащем "GoTo". Я признаю, что выражение вида 'a(b*c*)*' выглядит несколько странно :) но (!) зависон наблюдался из поиска и кодера, а в QSearch всё работало нормально. Собственно, из-за чего и не репортил - привык проверять корректность регулярок в QSearch и никак не мог отловить проблемное выражение.

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

Post by Drugmix »

Serge Yolkin wrote:Я признаю, что выражение вида 'a(b*c*)*' выглядит несколько странно :)
Вовсе не странное выражение.
Единственное, что с новым парсером, по моему опыту, лучше жадность явно задавать: хочется жадности? 'a(b*+c*+)*+'.
Хочется скромности? 'a(b*?c*?)*?' или просто 'a' :)

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

Post by DV »

Serge Yolkin wrote:Я признаю, что выражение вида 'a(b*c*)*' выглядит несколько странно :) но (!) зависон наблюдался из поиска и кодера, а в QSearch всё работало нормально.
В QSearch применяется "хак", убирающий завершающие * или + (кроме экранированных \* и \+ ).
Смысл "хака" в том, что выражения вида .* и .+ до сих пор остаются "сверхжадными", выделяя весь файл до конца, что неприемлемо для QSearch в режиме "поиска на лету" с регулярными выражениями (так как при наборе выражения вида A.+B в процессе набора A.+ выделялся бы весь файл до конца, а с донабором завершающего B выделение отступало бы назад).

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

Post by Drugmix »

Code: Select all

0	`((?<=\(\s*+)ByRef)` `\1=(0,${TYPE},0)`
0	`(?<=\(\s*+)(ByRef)` `\1=(0,${TYPE},0)`
Оба правила приводят к ошибке.
Суть правила заключается в том, чтобы подсвечивать только такой ByRef, перед которым находится открывающая скобка (и сколько угодно пробелов после неё).

Positive lookbehind'ы поломались?
С другой стороны, они теперь и не нужны: старых конфликтов между двумя разными правилами я больше не наблюдаю, всё что не попадает в группу захвата - остаётся "доступным" для других правил, так что во избежание возможных новых поломок - я бы лучше оставил всё, как есть сейчас.

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

Post by Drugmix »

Ещё, не получается сделать правило для раскраски := (оператора присваивания значения)

Code: Select all

0	`(\.=)` `\1=(0,${OP},#ff0000)`
работает для .=
а вот

Code: Select all

0	`(:=)` `\1=(0,${OP},#ff0000)`
не окрашивает :=

не понимаю в чём дело.

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

Post by Serge Yolkin »

DV
Спасибо за разъяснение

Drugmix
Не уверен, но попробуй экранировать и : и =
Post Reply