Page 1 of 1

Именованные группы в шаблонах регекспов

Posted: Sat 20 Sep, 2014 06:43
by Shmuel
Именованных групп в шаблонах фаровских регекспов вроде нет (в хелпе не упоминаются), но в плагине S&R 2.5 они есть и работают.
Справка S&R 2.5 wrote:Можно также создавать поименованные скобки: (?{name}pattern)
В качестве имени "name" может быть пустая строка (получается безымянная скобка, на которую нельзя сослаться) или последовательность из знаков слова (\w) и пробелов (\s).
В Фаре это не работает.
Как мне казалось, S&R 2.5 и Фар используют одну и ту же библиотеку К.Ступника.
Вопрос к тем, кто знает: куда девалась эта фича и можно ли её восстановить (я не имею в виду написание с нуля).

Re: Именованные группы в шаблонах регекспов

Posted: Sat 20 Sep, 2014 12:49
by DrKnS
В библиотеке эта фича была опциональна и при импорте в Far подключена не была.

При желании всё можно.

Re: Именованные группы в шаблонах регекспов

Posted: Sat 20 Sep, 2014 13:52
by Shmuel
Было бы неплохо.

Отключена эта фича неудачно: до некоторого билда Фара выдавалось сообщение "could not find the string", а теперь как будто находит пустую строку в месте нахождения курсора (т.е. ничего не происходит). И то, и другое - неправильно: если фича отключена, значит шаблон этот - невалидный, о чём и должно сообщаться.

Update: "ничего не происходит" - это кажется реакция поиска в редакторе на любой невалидный шаблон.

Re: Именованные группы в шаблонах регекспов

Posted: Sat 20 Sep, 2014 15:26
by DrKnS
4112.
Фича включена на уровне библиотеки.
Для работы с ней также необходим клиентский код, если есть желание написать его - welcome.
Вместо "ничего не происходит" будут показываться разнообразные ошибки.
Текст ошибок не локализован, если есть желание перевести его - тоже welcome.

Re: Именованные группы в шаблонах регекспов

Posted: Sat 20 Sep, 2014 15:34
by Shmuel
Не могу собрать с VC2010.

Re: Именованные группы в шаблонах регекспов

Posted: Sat 20 Sep, 2014 16:19
by Shmuel
DrKnS wrote:4112.
[.....]
Вместо "ничего не происходит" будут показываться разнообразные ошибки.
Не считаю, что принудительный показ ошибки Фаром при вызове функций API плагином или макросом - это хорошо.

Пример: lua:mf.fmatch("txt","/txt$") выводит на экран

Code: Select all

╔═════════════ Error ═════════════╗
║ Expression contain syntax error ║
║ /txt$                           ║
║     ^                           ║
╟─────────────────────────────────╢
║             { OK }              ║
╚═════════════════════════════════╝
Кстати, позиция ошибки должна быть на 1 правее.
А также contains, а не contain.

Re: Именованные группы в шаблонах регекспов

Posted: Sat 20 Sep, 2014 17:57
by Shmuel
DrKnS wrote:4112.
Фича включена на уровне библиотеки.
Для работы с ней также необходим клиентский код, если есть желание написать его - welcome.
Что имеется в виду под клиентским кодом - расширение API RegExpControl ?

Re: Именованные группы в шаблонах регекспов

Posted: Sat 20 Sep, 2014 19:41
by DrKnS
С вышеописанным согласен, 4114.
Под клиентским кодом имеется в виду то, что в Search/Match надо передавать словарь (std::unordered_map<std::wstring, RegExpMatch>) который будет заполнен парами "имя: координаты", ну и потом что-то с этой информацией делать.

В плане API - нужно расширение структуры RegExpSearch (что будет весело, т. к. никто не напрягся добавить туда StructSize во время ломания API) и изобретение какого-то аналога map на plain C.

Re: Именованные группы в шаблонах регекспов

Posted: Sat 20 Sep, 2014 20:02
by zg
там есть void* Reserved.

Re: Именованные группы в шаблонах регекспов

Posted: Sat 20 Sep, 2014 21:48
by DrKnS
А если потом ещё что-то понадобится?

Re: Именованные группы в шаблонах регекспов

Posted: Sat 20 Sep, 2014 22:51
by zg
DrKnS wrote:А если потом ещё что-то понадобится?
понадобиться — будем думать.

Именованные группы в шаблонах регекспов

Posted: Sun 01 Feb, 2015 16:30
by DrKnS
Добавил сабж в редактор.

Именованные группы в шаблонах регекспов

Posted: Sun 01 Feb, 2015 17:11
by Shmuel
1. Я бы предложил, пока ещё не привыкли к существующему синтаксису (в поиске), изменить его на более стандартный (как в Perl, PCRE, Oniguruma).
То-есть, вместо (?{name}...) сделать допустимыми (?<name>...) и (?'name'...)

2. А также, как в PCRE и Oniguruma, именованная группа должна получать и номер тоже. У нас она не получает, и это неправильно.