alexkmbk / RegEx1CAddin

Native API component for executing regular expressions on 1C: Enterprise platform / Внешняя Native API компонента для выполнения регулярных выражений на платформе 1С:Предприятие 8
The Unlicense
173 stars 32 forks source link

Планируется ли делать аналог свойства SubMatches в VBScript.RegExp в результате поиска совпадений? #3

Closed LevkinSergey closed 3 years ago

alexkmbk commented 4 years ago

Точно в таком виде не планируется, поскольку есть ограничение со стороны протокола NativeAPI на то, какие типы значений может возвращать внешняя компонента. Но принимаются предложения по расширению функционала для решения проблемы обхода групп результатов поиска.

Вот здесь уже поднимали вопрос по этой проблеме - http://forum.infostart.ru/forum28/topic203542/message2261568/#message2261568

LevkinSergey commented 4 years ago

Но принимаются предложения по расширению функционала для решения проблемы обхода групп результатов поиска.

У меня две идеи. Вторая на мой взгляд проще в использовании.

Первый вариант. Реализовать метод Выбрать(), который будет производить выборку в текущей группе. И обходить группу уже существующим методов следующий(). На 1С код по обходу примерно следующий будет

Рег.НайтиСовпадения("Hello world", "([A-Za-z]+)\s+([a-z]+)");

//Обходим MatchCollection
Пока Рег.Следующий() Цикл
ТекстMatch=Рег.ТекущееЗначение;

 //Обходим SubMatches
Рег.Выбрать();
Пока Рег.Следующий() Цикл
 ТекстSubMatch=Рег.ТекущееЗначение;
КонецЦикла;

КонецЦикла;

Второй вариант. Реализуем еще один метод СледующийПодчиненный(), Который будет обходить коллекцию SubMatches. Код в 1С по обходу примерно следующий

Рег.НайтиСовпадения("Hello world", "([A-Za-z]+)\s+([a-z]+)");

//Обходим MatchCollection
Пока Рег.Следующий() Цикл
ТекстMatch=Рег.ТекущееЗначение;

 //Обходим SubMatches
Пока Рег.СледующийПодчиненный() Цикл
 ТекстSubMatch=Рег.ТекущееЗначение;
КонецЦикла;

КонецЦикла;
alexkmbk commented 4 years ago

@LevkinSergey Большое спасибо за предложения!

Мне ближе второй вариант, я бы сделал так: 1) чтобы не ломать совместимость с сущетсвующим поведением, добавить признак ИерархическийОбходРезультатов, со значением по умолчанию Ложь.

Если ИерархическийОбходРезультатов = Истина, тогда метод Следующий() будет обходить только верхний уровень, то есть целиком найденную строку, без вложенных групп.

2) добавить метод КоличествоВложенныхГрупп(), который будет возвращать количество групп в результатах запроса (количество всегда фиксировано для заданного шаблона).

3) добавить метод ПолучитьПодгруппу(ИндексПодгруппы), который будет возвращать значение найденной группы по индексу.

LevkinSergey commented 4 years ago

так даже лучше получается. Только один вопрос. После позиционирования на подгруппе методом ПолучитьПодгруппу(ИндексПодгруппы), можно ли будет обойти ее вхождения с помощью метода Следующий()?

alexkmbk commented 4 years ago

так даже лучше получается. Только один вопрос. После позиционирования на подгруппе методом ПолучитьПодгруппу(ИндексПодгруппы), можно ли будет обойти ее вхождения с помощью метода Следующий()?

Метод ПолучитьПодгруппу будет возвращать само строковое значение найденной подгруппы. То есть это не позиционирование, а именно получение значения.

Например:

Рег.ИерархическийОбходРезультатов = Истина;
Рег.НайтиСовпадения("Hello world", "([A-Za-z]+)\s+([a-z]+)");

Сообщить( Рег.Количество()); // 1 - всего один результат, а не 3 
Сообщить( Рег.КоличествоВложенныхГрупп()); // 2 - две подгруппы (submatches)

//Обходим MatchCollection
Пока Рег.Следующий() Цикл
Сообщить(Рег.ТекущееЗначение); // Hello world
Сообщить(Рег.ПолучитьПодгруппу(0)); // Hello
Сообщить(Рег.ПолучитьПодгруппу(1)); // world
КонецЦикла;
LevkinSergey commented 4 years ago

понял. То что нужно.

alexkmbk commented 4 years ago

@LevkinSergey Выложил тестовую сборку, пока только для Windows и Linux.

Реализовал новый функционал по описанной ранее схеме, за исключением добавления параметра ИерархическийОбходРезультатов . Его добавлять не стал, вместо этого, добавил этот признак третьим параметром в методе НайтиСовпадения / Matches. По умолчанию равен Ложь, то есть сохраняется совместимость поведения с предыдущими версиями.

LevkinSergey commented 4 years ago

будет ли сборка для браузеров 11-й версии в ближайшее время?

alexkmbk commented 4 years ago

будет ли сборка для браузеров 11-й версии в ближайшее время?

В ближайшее время собрать к сожалению нет времени.

alexkmbk commented 3 years ago

@LevkinSergey

будет ли сборка для браузеров 11-й версии в ближайшее время?

Добавлена сборка для веб браузера Google Chrome под Windows - https://github.com/alexkmbk/RegEx1CAddin/releases/tag/11.6

LevkinSergey commented 3 years ago

Вроде работает. Спасибо.

Добавил новые методы и описал наконец подсистему, основанную на вашей компоненте https://github.com/cpr1c/RegEx1C_cfe