Closed LevkinSergey closed 3 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=Рег.ТекущееЗначение;
КонецЦикла;
КонецЦикла;
@LevkinSergey Большое спасибо за предложения!
Мне ближе второй вариант, я бы сделал так: 1) чтобы не ломать совместимость с сущетсвующим поведением, добавить признак ИерархическийОбходРезультатов, со значением по умолчанию Ложь.
Если ИерархическийОбходРезультатов = Истина, тогда метод Следующий() будет обходить только верхний уровень, то есть целиком найденную строку, без вложенных групп.
2) добавить метод КоличествоВложенныхГрупп(), который будет возвращать количество групп в результатах запроса (количество всегда фиксировано для заданного шаблона).
3) добавить метод ПолучитьПодгруппу(ИндексПодгруппы), который будет возвращать значение найденной группы по индексу.
так даже лучше получается. Только один вопрос. После позиционирования на подгруппе методом ПолучитьПодгруппу(ИндексПодгруппы), можно ли будет обойти ее вхождения с помощью метода Следующий()?
так даже лучше получается. Только один вопрос. После позиционирования на подгруппе методом ПолучитьПодгруппу(ИндексПодгруппы), можно ли будет обойти ее вхождения с помощью метода Следующий()?
Метод ПолучитьПодгруппу будет возвращать само строковое значение найденной подгруппы. То есть это не позиционирование, а именно получение значения.
Например:
Рег.ИерархическийОбходРезультатов = Истина;
Рег.НайтиСовпадения("Hello world", "([A-Za-z]+)\s+([a-z]+)");
Сообщить( Рег.Количество()); // 1 - всего один результат, а не 3
Сообщить( Рег.КоличествоВложенныхГрупп()); // 2 - две подгруппы (submatches)
//Обходим MatchCollection
Пока Рег.Следующий() Цикл
Сообщить(Рег.ТекущееЗначение); // Hello world
Сообщить(Рег.ПолучитьПодгруппу(0)); // Hello
Сообщить(Рег.ПолучитьПодгруппу(1)); // world
КонецЦикла;
понял. То что нужно.
@LevkinSergey Выложил тестовую сборку, пока только для Windows и Linux.
Реализовал новый функционал по описанной ранее схеме, за исключением добавления параметра ИерархическийОбходРезультатов . Его добавлять не стал, вместо этого, добавил этот признак третьим параметром в методе НайтиСовпадения / Matches. По умолчанию равен Ложь, то есть сохраняется совместимость поведения с предыдущими версиями.
будет ли сборка для браузеров 11-й версии в ближайшее время?
будет ли сборка для браузеров 11-й версии в ближайшее время?
В ближайшее время собрать к сожалению нет времени.
@LevkinSergey
будет ли сборка для браузеров 11-й версии в ближайшее время?
Добавлена сборка для веб браузера Google Chrome под Windows - https://github.com/alexkmbk/RegEx1CAddin/releases/tag/11.6
Вроде работает. Спасибо.
Добавил новые методы и описал наконец подсистему, основанную на вашей компоненте https://github.com/cpr1c/RegEx1C_cfe
Точно в таком виде не планируется, поскольку есть ограничение со стороны протокола NativeAPI на то, какие типы значений может возвращать внешняя компонента. Но принимаются предложения по расширению функционала для решения проблемы обхода групп результатов поиска.
Вот здесь уже поднимали вопрос по этой проблеме - http://forum.infostart.ru/forum28/topic203542/message2261568/#message2261568