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

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

Post by Drugmix »

opk44 wrote:
Drugmix wrote:По-моему, все проблемы связанные с жадностью - исчезли бы, если была бы добавлена поддержка настройки U (ungreedy), которую можно было бы в шаблоне включать и отключать многократно, в нужных местах шаблона.
1. У каждого есть право на собственное мнение.
2. Не вижу особых преимуществ у "U" перед уже имеющимся "?". Тем самым не понимаю, почему бы это введение еще одного регулятора нежадности могло вдруг решить "все проблемы связанные с жадностью".
1. У Вас есть право хранить молчание! ;)
2. Так можно было бы их комбинировать:
haystack: aaabbbcccaaabbbccc
a.*c matches aaabbbcccaaabbbccc
a.*?c matches aaabbbcccaaabbbc
U)a.*c matches aaabbbc
U)a.*?c matches abbbc

Это я просто в качестве примера привёл (даже вероятно, что довольно мало продуманного).
Ведь удобней же, когда правила можно более удобно (и более гибкие) создавать.

Offline
Posts: 874
Joined: Sat Jan 16, 2010 2:03 pm

Post by opk44 »

Drugmix wrote:
opk44 wrote:
Drugmix wrote:По-моему, все проблемы связанные с жадностью - исчезли бы, если была бы добавлена поддержка настройки U (ungreedy), которую можно было бы в шаблоне включать и отключать многократно, в нужных местах шаблона.
1. У каждого есть право на собственное мнение.
2. Не вижу особых преимуществ у "U" перед уже имеющимся "?". Тем самым не понимаю, почему бы это введение еще одного регулятора нежадности могло вдруг решить "все проблемы связанные с жадностью".
1. У Вас есть право хранить молчание! ;)
2. Так можно было бы их комбинировать:
haystack: aaabbbcccaaabbbccc
a.*c matches aaabbbcccaaabbbccc
a.*?c matches aaabbbcccaaabbbc
U)a.*c matches aaabbbc
U)a.*?c matches abbbc

Это я просто в качестве примера привёл (даже вероятно, что довольно мало продуманного).
Ведь удобней же, когда правила можно более удобно (и более гибкие) создавать.
1. Во-первых, не нужно хамить, ироничный Вы наш.
2. Во-вторых, вы меня опять не поняли.
3. В-третьих, не ясно на чем проверялись ваши примеры (они проверялись?). Думается, (2)и(4) не корректны.

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

Post by Drugmix »

opk44 wrote:1. Во-первых, не нужно хамить, ироничный Вы наш.
2. Во-вторых, вы меня опять не поняли.
3. В-третьих, не ясно на чем проверялись ваши примеры (они проверялись?). Думается, (2)и(4) не корректны.
Какое хамство? Я и не думал хамить. Просто не понятно к чему Вы написали, что каждый имеет право на своё мнение - это же и так всем понятно. И я тут делюсь своими соображениями тоже в виде высказывания лишь своего мнения. А на утверждение очевидного я всегда отвечаю аналогичным утверждением, это не хамство.
2. И Вы даже не расскажете в чём я Вас не понял?

3. Они не проверялись, но они не могут быть некорректными: сейчас товарищ Instructor переделывает парсинг шаблонов регулярных выражений в акелпаде. Переделать он его может так, как захочет, а я лишь предложил ещё один вариант как это сделать. Мой вариант может не нравиться или показаться непродуманным кому-либо, но он не может быть некорректным т.к. это лишь идея и пока она не реализована в коде - то и проверять-то нечего.
Или в предлагаемом мной варианте должна быть какая-то логическая ошибка, которая делает мой вариант невозможным для реализации. Если Вы заметили такую ошибку - то, пожалуйста, укажите на неё и поясните почему Вы считаете, что это не будет работать.

Offline
Posts: 176
Joined: Sat Dec 24, 2011 4:05 pm

Post by F. Phoenix »

YuS wrote:Ну, не знаю... а в чем слабость? Неудобность - больше дело привычки, наверное.
Ну, я начал юзать регулярки на платформе .NET, под которую в основном и пишу - и вот там они довольно сильные: с поддержкой Юникода, именованных ссылок и т.п. (MSDN) - сильнее, чем JS... Но Акел сейчас и до нее не дотягивает. Слаб и неудобен в первую очередь из-за неполной поддержки модификаторов жадности и неоднозначности некоторых моментов (регулярки ж что формулы - тут точность важна), а во-вторых из-за нехватки терпимости к неоптимальным шаблонам. А привыкнуть к несколько отличному набору правил-то можно, конечно, лишь бы он был достаточно целостным, гармоничным и точным.

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

Post by Drugmix »

Instructor
будут ли ещё какие-то изменения в работе RegEx или уже можно рассчитывать на то, что текущая тестовая версия станет релизной?

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

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

Post by Instructor »

Drugmix
Как минимум необходимо устранить указанное выше зависание.

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

Post by Instructor »

Drugmix wrote:в последней тестовой версии, правило

Code: Select all

0   `(")((?:[^"]*(?:"")?)*)("(?!"))` `\1=(2,#ff0000,0) \2=(3,#00ff00,0) \3=(3,#ff0000,0)`
вешает AkelPad навсегда...
Тестовая версия

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

Post by Drugmix »

Instructor
Акелпад оно теперь не вешает, но и работает иначе. Если напечатать

Code: Select all

asda " asdasd " asdasd "  sadasd
то левая часть в кавычках - не окрашивается. Причём если скопировать этот текст, открыть новую вкладку и вставить его - то левая часть окрасится (до тех пор, пока пользователь не начнёт дальше что-то печатать):
Image

Offline
Posts: 269
Joined: Mon Jun 20, 2011 8:33 am
Location: Электросталь

Post by yozhic »

В тексте есть теги [aaa]...[/aaa], нужно заменить их на [bbb]...[/bbb].
Найти: \[(/?)aaa\]
Заменить: [\1bbb]
Регулярные выражения включены
Если менять поштучно кнопкой Replace, то обрабатывает корректно (точнее как задумано), а если нажать Replace All, то во все теги проставляет слэши [/bbb]...[/bbb]. В EmEditor то же выражение обрабатывается корректно в обоих случаях. Если ошибка в выражении, прошу подсказать почему (хотя бы кратко).

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

Post by Instructor »

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

yozhic
Не воспроизводится. Версия 4.8.5?

Offline
Posts: 269
Joined: Mon Jun 20, 2011 8:33 am
Location: Электросталь

Post by yozhic »

Instructor
4.8.5 (простите сразу не сказал). Только что воспроизвёл на новом файле (правда частично). Текст:
[aaa]ccc[/aaa]
ccc [aaa]ccc[/aaa] [aaa]ccc[/aaa]
Если сразу нажать Replace All, то заменяет корректно. Если нажать Replace 2 раза и потом (при выделенном [aaa]) Replace All, то первое [aaa] заменится на [/bbb], а остальные корректно. Если нужно могу выслать фрагмент текста, где у меня во всех тегах слэши проставились.

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

Post by Drugmix »

Instructor
вроде бы всё нормально, только теперь мне нужна помощь в составлении более точного правила для winget.
Текущее правило

Code: Select all

0   `^\s*(WinGet)(?:\s*,\s*|\s+)(.*)(\s*,\s*(.*)(\s*,\s*(.*)(\s*,\s*(.*)(\s*,\s*(.*)(\s*,\s*(.*))?)?)?)?)?` `\1=(2,${OP},0) \2=(2,${VAR},#00ff00) \4=(2,${OP},#ff0000) \6=(2,${VAR},#0000ff) \8=(2,${OP},#ff0000) \10=(2,${VAR},#00ff00) \12=(2,${OP},#0000ff)`
имеет 2 проблемы:
1. в строке

Code: Select all

winget, a            
все пробелы после "a" - тоже окрашиваются до тех пор, пока не поставить запятую, а судя по RegExp-у, насколько я понимаю, - не должно бы.
2. совсем забыл про комментарии:

Code: Select all

winget a ; это комментарий. Он не должен бы раскрашиваться, но раскрашивается тем же цветом, что и "a".

Code: Select all

/*
winget, это многострочный комментарий, но он раскрашивается как код, что есть ошибка и чего не происходит в текущей стабильной версии акелпада
*/

Внутристрочные начинаются с \s+; (т.е. любого положительного кол-ва "пробельных символов" и следующей за ними точкой с запятой), а заканчиваются символом новой строки или символом конца документа.
Многострочные комментарии начинаются с ^\s*/\* - т.е. с новой строки, затем может идти любое кол-во "пробельных символов" (можно и 0), а затем должно идти /*
а заканчиваются многострочные комментарии на ^\s*\*/ - т.е. с новой строки, затем может идти любое кол-во "пробельных символов" (можно и 0), а затем должно идти */


Сейчас на стабильной версии AkelPad с правилом

Code: Select all

0   `^\s*(WinGet)(?:\s*,\s*|\s+)(.*)(?:\s*,\s*|\s+)((.*)(?:\s*,\s*|\s+)((.*)(?:\s*,\s*|\s+)((.*)(?:\s*,\s*|\s+)((.*)(?:\s*,\s*|\s+)((.*))?)?)?)?)?` `\1=(2,${OP},0) \2=(2,${VAR},#00ff00) \4=(2,${OP},#ff0000) \6=(2,${VAR},#0000ff) \8=(2,${OP},#ff0000) \10=(2,${VAR},#00ff00) \12=(2,${OP},#0000ff)`
в многострочных комментариях winget, как и должно быть, - не окрашивается этим правилом как команда.

Если кто-то может - пожалуйста, подправьте правило под новый парсер и с учётом вышеописанных двух замечаний.
Last edited by Drugmix on Tue Oct 15, 2013 10:42 am, edited 1 time in total.

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

Post by Instructor »


Offline
Posts: 269
Joined: Mon Jun 20, 2011 8:33 am
Location: Электросталь

Post by yozhic »

Instructor
Теперь всё отлично, спасибо.

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

Post by Instructor »

Drugmix
Веселое правило получается :)

Code: Select all

0   `^\s*(WinGet)(?:\s*,\s*|\s+)([^\s;]*)(\s*,\s*([^\s;]*)(\s*,\s*([^\s;]*)(\s*,\s*([^\s;]*)(\s*,\s*([^\s;]*)(\s*,\s*([^\s;]*))?)?)?)?)?` `\1=(2,${OP},0) \2=(2,${VAR},#00ff00) \4=(2,${OP},#ff0000) \6=(2,${VAR},#0000ff) \8=(2,${OP},#ff0000) \10=(2,${VAR},#00ff00) \12=(2,${OP},#0000ff)`
Post Reply