AkelPad Forum Index AkelPad
Support forum
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Регулярные выражения
Goto page Previous  1, 2, 3 ... 12, 13, 14 ... 20, 21, 22  Next
 
Post new topic   Reply to topic    AkelPad Forum Index -> Discussion (Russian)
View previous topic :: View next topic  
Author Message
YuS



Joined: 15 Sep 2013
Posts: 126

PostPosted: Sat Jan 18, 2014 6:16 am    Post subject: Reply with quote

YuS wrote:
Drugmix wrote:
По правилам синтаксиса ahk:
1. Только первый аргумент можно писать через пробел от команды, пропустив запятую.

Так это может в корне поменять подход к написанию регулярки. Если я правильно понял, то пробел не может являться разделителем самих аргументов? Если так, то в массиве с валидными строками это правило нарушено...

В общем, как-то так:
Code:
0   "^\s*(?:(Else)(?:\s*,\s*|\s+)|(Try)(?:\s*,\s*|\s+)|([^:]{1,38}(?=::))::)*\s*(#IfWinActive\b)\s*?,?\s*?([^;,`]+(?!`.)|[^`,;]+`.|`.)*?\s*?,?\s*?([^;,`]+?(?!`.)|[^`,;]+?`.|`.)*?(\s+;.*)?\s*$" `\1=(4,${OP},0) \2=(4,${IF},0) \3=(2,${STR},0) \4=(2,${TYPE},0) \5=(2,${ATTR},#ff0000) \6=(2,${ATTR},#00ff00) \7=(3,${COMM},0)`

Не подсвечивается только та часть массива, где нарушено правило разделителей, т.е. шесть строк с тремя аргументами...
Back to top
View user's profile Send private message
Drugmix



Joined: 08 Apr 2013
Posts: 444

PostPosted: Sat Jan 18, 2014 9:33 am    Post subject: Reply with quote

YuS wrote:
Так это может в корне поменять подход к написанию регулярки. Если я правильно понял, то пробел не может являться разделителем самих аргументов? Если так, то в массиве с валидными строками это правило нарушено...

Да, правильно поняли: нет, пробел может быть разделителем только первого аргумента от команды. Между аргументами раздилителем может быть всегда только неэкранированная запятая.

YuS wrote:
Если символ экранирования "`" присутствует в конце аргумента, то значит последующий символ экранируется и является частью аргумента, т.е. при наличии комментария в строке, последующий комментарий не выдерживает условия наличия пробела перед ";", так что всё правильно, а в случае отсутствия комментария - ничего не ломается. Или таки символ экранирования может принимать другие значения, кроме, собственно, экранирования? Если да, то такую неоднозначность трудно обработать, если вообще возможно...
Ну, можно и опустить этот случай, конечно, хотя ` в конце строки поломает окраску даже тогда, когда после неё нет комментария. В принципе, просто пробел нельзя же экранировать, поэтому когда ` присутствует в конце строки (перед комментарием или когда комментария нет) он парсером просто пропускается (считается как опущенный аргумент, если в аргументе ничего кроме ` нет). Довольно редкий случай, поэтому, можно и опустить.

YuS wrote:
Ну, не совсем так. Движок по регуляркам, пока достаточно точно соответствует PCRE, за исключением некоторых особенностей, но это скорее необходимость, чем прихоть. Единственный момент - очень не хватает поиска по условию, с ним было бы гораздо проще в написании регулярок...

Я не про "вообще изменить его", а лишь подправить что-то, чтоб конструкция ([^,]|(?<=`),)* нормально заработала.

YuS wrote:
Не подсвечивается только та часть массива, где нарушено правило разделителей, т.е. шесть строк с тремя аргументами...

Да, я позже только заметил, что эти строки ошибочно присутствуют в "SHOULD WORK:", извините.

YuS wrote:
В общем, как-то так:
Code:
0   "^\s*(?:(Else)(?:\s*,\s*|\s+)|(Try)(?:\s*,\s*|\s+)|([^:]{1,38}(?=::))::)*\s*(#IfWinActive\b)\s*?,?\s*?([^;,`]+(?!`.)|[^`,;]+`.|`.)*?\s*?,?\s*?([^;,`]+?(?!`.)|[^`,;]+?`.|`.)*?(\s+;.*)?\s*$" `\1=(4,${OP},0) \2=(4,${IF},0) \3=(2,${STR},0) \4=(2,${TYPE},0) \5=(2,${ATTR},#ff0000) \6=(2,${ATTR},#00ff00) \7=(3,${COMM},0)`

Спасибо, сходу прошло все существующие тесты и даже не ломается на двух подряд идущих экранированных символа.
Спасибо огромное!
Пока что, это лучшее из всех правил и ломается только на ` в конце строки, других отхождений от канонов парсера - пока не заметил.
Back to top
View user's profile Send private message
YuS



Joined: 15 Sep 2013
Posts: 126

PostPosted: Sat Jan 18, 2014 12:22 pm    Post subject: Reply with quote

.del

Last edited by YuS on Sun Jan 19, 2014 6:49 am; edited 1 time in total
Back to top
View user's profile Send private message
YuS



Joined: 15 Sep 2013
Posts: 126

PostPosted: Sun Jan 19, 2014 6:44 am    Post subject: Reply with quote

Drugmix wrote:
лишь подправить что-то, чтоб конструкция ([^,]|(?<=`),)* нормально заработала.

Так, стоп, полез в AkelHelp, а lookbehind-ы описаны там, т.е. должны работать и работают, но почему-то в шаблоне с вариантами в группе "|", происходит захват мнимого символа из шаблона просмотра. Например:
Code:
((?<=d)g|(?<=`),)

найдет в тексте все "g" с предшествующим "d" и все "," с предшествующими "`", но при поиске захватывает не "g" и "," соответственно, а "dg" и "`,". Если же поиск осуществлять без вариантов в группе, по отдельности, то захват символов происходит, как и предполагается - очень похоже, что присутствует какая-то ошибка. Огромная просьба к автору проверить этот момент.
Back to top
View user's profile Send private message
Instructor
Site Admin


Joined: 06 Jul 2006
Posts: 5396

PostPosted: Sun Jan 19, 2014 12:43 pm    Post subject: Reply with quote

Serge Yolkin wrote:
Code:
^[^d]\S+(?!.*\=)
Тестовая
Back to top
View user's profile Send private message Send e-mail
Serge Yolkin



Joined: 27 Jul 2010
Posts: 272

PostPosted: Sun Jan 19, 2014 8:41 pm    Post subject: Reply with quote

Instructor
Последнюю тестовую пока не уронил. И по проблемным прошёлся - ничего, и по ранее работавшим - продолжают работать, и наэкспериментировался за 3 часа вдоволь. Работает. Подсветка на существующих файлах в норме. Завтра ещё помучаю, но энтузиазма поубавилось.
Back to top
View user's profile Send private message
Instructor
Site Admin


Joined: 06 Jul 2006
Posts: 5396

PostPosted: Mon Jan 20, 2014 11:09 am    Post subject: Reply with quote

Serge Yolkin wrote:
(?<=) и (?<=|) по-моему, всё-таки, снтаксическая ошибка.
Добавлено в тестовой.

Drugmix, YuS
Переписана реализация (?<=шаблон) и (?<!шаблон).

Тестовая версия
Back to top
View user's profile Send private message Send e-mail
YuS



Joined: 15 Sep 2013
Posts: 126

PostPosted: Mon Jan 20, 2014 3:49 pm    Post subject: Reply with quote

Instructor wrote:

Переписана реализация (?<=шаблон) и (?<!шаблон).

Теперь захватывает только предполагаемые символы.
Однако интересное поведение работы выше предложенного шаблона:
Code:
([^,]|(?<=`),)*

Например, в тексте:
Code:
abc,,,,,` `,`,abcfkd`,

последовательно захватываются символы:
Code:
"abc"
далее четыре захвата мнимых символа между запятыми (т.е. фактически они не выделяются, конечно, но курсор четыре раза занимает положение между запятыми при нажатии "Find next")
"` `,`,abcfkd`,"

Остановка, видимо, происходит из-за наличия запятой и невыполненного условия второй части группы, но тут бы, если конечно возможно, подопнуть бы алгоритм, чтобы он не останавливался при отсутствии необходимых символов, а продолжил искать далее по тексту совпадение...
Back to top
View user's profile Send private message
Drugmix



Joined: 08 Apr 2013
Posts: 444

PostPosted: Mon Jan 20, 2014 4:30 pm    Post subject: Reply with quote

YuS
а я считаю, что и правильно, что останавливается там. Ведь в шаблоне задана * в конце, а не +.
В конце концов, задача у пользователя же могла быть и такой "заменить каждую, удовлетворяющую шаблону строку на такой-то текст"
Back to top
View user's profile Send private message
YuS



Joined: 15 Sep 2013
Posts: 126

PostPosted: Mon Jan 20, 2014 5:18 pm    Post subject: Reply with quote

Drugmix wrote:

а я считаю, что и правильно, что останавливается там. Ведь в шаблоне задана * в конце, а не +.

Верно, согласен, посыпаю голову пеплом. Ведь сам выше говорил, что null может являться шаблоном, а тут как-то не учел этот момент. Smile
Back to top
View user's profile Send private message
Drugmix



Joined: 08 Apr 2013
Posts: 444

PostPosted: Mon Jan 20, 2014 10:27 pm    Post subject: Reply with quote

Instructor wrote:
Drugmix, YuS
Переписана реализация (?<=шаблон) и (?<!шаблон).

Тестовая версия

Это просто офигенно, огромнейшая Вам благодарность за переписанную реализацию работы lookbehind'ов!
В этой версии я смог написать полностью правильно работающее правило раскраски для одной команды, с учётом, вроде как, вообще всех возможных валидных вариантов употребления этой команды.
Code:
0   "^\s*(?:(Else)(\s*,\s*|\s+)|(Try)(\s*,\s*|\s+)|(.{1,38}(?=::))(::))*\s*(#IfWinActive)(?:(\s*,\s*|\s+)(([^;,\s]|(?<=`),|(?<!\s);|\s*(?!\s*?(?:;|$)))*?)?(?:(\s*(?<!`),\s*)(([^;,]|(?<=`),|(?<!\s);)*?)?)?)?\s*?((?<=\s);.*$)?$" `\1=(4,${OP},0) \2=(0,0,0) \3=(4,${IF},0) \4=(0,0,0) \5=(2,${STR},0) \6=(0,0,0) \7=(3,${TYPE},0) \8=(0,0,0) \10=(0,${ATTR},#ff0000) \11=(0,0,0) \13=(0,${ATTR},#00ff00) \14=(3,${COMM},0)`


Теперь я наконец-то смогу завершить создание примитивное IDE для autohotkey.

Как только изменения из этой тестовой версии войдут в релизную ветку - то можно будет утверждать, что теперь используя связку AkelPad+Coder plugin можно написать примитивную IDE для разных языков.

Instructor, прошу по возможности учесть и остальные пожелания связанные с функционалом IDE.
Back to top
View user's profile Send private message
Serge Yolkin



Joined: 27 Jul 2010
Posts: 272

PostPosted: Tue Jan 21, 2014 9:49 am    Post subject: Reply with quote

Instructor
Да, последняя тестовая очень интересная. Поигрался, жду релиза с нетерпением.

P.S. 5.0? Smile
Back to top
View user's profile Send private message
Serge Yolkin



Joined: 27 Jul 2010
Posts: 272

PostPosted: Sat Jan 25, 2014 4:21 am    Post subject: Reply with quote

Instructor
Ещё э-э-э... забавное поведение регулярок. Воспроизводится на последних тестовых, на стабильной - всё нормально. Конструкция [] в целом работает, но если залезть на шкаф... точнее, использовать её в (?<=[]) или (?<![]), то она перестаёт любить \\
Code:
(?<![s%])s
работает, а
(?<![s%\\])s
как-то не очень
Back to top
View user's profile Send private message
Instructor
Site Admin


Joined: 06 Jul 2006
Posts: 5396

PostPosted: Sat Jan 25, 2014 5:53 am    Post subject: Reply with quote

Serge Yolkin
Тестовая версия
Back to top
View user's profile Send private message Send e-mail
YuS



Joined: 15 Sep 2013
Posts: 126

PostPosted: Sat Jan 25, 2014 7:09 am    Post subject: Reply with quote

Skif_off wrote:
YuS
Code:
TabNameFind=^([^\n]{20})[^.\n]*(?:(\.)((?(2)[^.\n]*)))*$
TabNameRep=\1..\2\3

Получаю

Ну, это уже не вопрос функционала поиска по условию, а в правильном составлении регэкспа... в общем, это в данной теме уместнее будет.

Skif_off wrote:

Quote:
1.
Слияние_текстовых_файлов_в_папке.au3
Слияние_текстовых_фа...au3
2.
MINIMIZETOTRAY-RUS.TXT
MINIMIZETOTRAY-RUS.T..
3.
Quoted-Printable.au3
Quoted-Printable.au3..

1. Тут всё верно, что не так? Длина имени файла с расширением > 20 символов.
2. Тут надо корректировать регулярку. Длина имени файла с расширением >20 символов, но правило [^\n]{20} захватывает разделительную точку и для существующего регэкспа, расширение просто отсутствует...
3. См. п.2 - захвачено 20 символов и расширение отсутствует.
В общем, надо переделывать регулярное выражение, чтобы оно учитывало все варианты.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    AkelPad Forum Index -> Discussion (Russian) All times are GMT
Goto page Previous  1, 2, 3 ... 12, 13, 14 ... 20, 21, 22  Next
Page 13 of 22

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


SourceForge.net Logo Powered by phpBB © 2001, 2005 phpBB Group