gifts2017

Регулярные выражения без COM объектов и внешних компонент

Опубликовал Тимофей Бугаевский (boogie) в раздел Программирование - Практика программирования

Платформа до сих пор не поддерживает регулярные выражения, хотя они уже стали довольно востребованной возможностью в разных языках программирования. Использование COM объектов и внешних компонент имеет ограничения, поэтому предлагается вариант реализации ограниченного функционала на встроенном языке 1С.

Данный функционал реализован в конфигурации 1С:Переводчик начиная с версии 2.1.

Бесплатно скачать её можно на сайте 1C:Developer Network.

Подробнее о регулярных выражениях удачнее всего, на мой взгляд, написано в документации PHP.

Хороший отладчик регулярных выражений.

Поддерживаемый синтаксис:

 Модификаторы, должны располагаться в начале шаблона, например (?i):
   i - регистронезависимый поиск.
   Символы шаблона:
    .  - один любой символ. 
    \. - символ точка.
    \s - пробельный символ.
    \d - цифра.
    \n - символ новой строки.
    \r - символ возврата каретки.
    \S - не пробельный символ.
    *  - любое количество символов (должен располагаться после повторяемого символа, 
      например .*), по умолчанию работает в режиме "жадный".
    +  - один или больше символов (должен располагаться после повторяемого символа,
      например .+), по умолчанию работает в режиме "жадный".
    ?  - один или ни одного символа (должен располагаться после повторяемого символа, 
      например .?), по умолчанию работает в режиме "жадный".
    ? после * или + - переключает режим "жадный" в режим "ленивый".
    \A, ^ - начало строки.
    \z, $ - конец строки.
    (, ) - начало и конец группы, например (на|около).
    | - разделитель альтернатив в группе.
    [, ] - начало и конец списка символов, например [abxv\s], [^R].
   ^ - в начале списка символов означает, что список содержит символы, которые не должны
    совпасть со строкой.
    \], \[, \), \(, \}, \{ - открывающие и закрывающие скобки: ], [, ), (, }, {.
    \\, \/ - слеши: \, /.
    \? - знак вопроса.
    \+ - знак плюса.
    \- - знак минуса.
    \* - знак звёздочка.
    \^ - знак циркумфлекс.
    \$ - знак доллара.
    \| - знак вертикальной полосы.

В прилагаемой к статье обработке приводится пример использования этой возможности.

Поиск в заданной строке по регулярному выражению выполняет функция MatchWildcard модуля StringFunctionsExClientServer. Она возвращает массив с найденными вхождениями, каждый элемент массива - это соответствие, содержащее в нулевом элементе полную найденную строку, а цифрами от 1 и далее - найденные в этом вхождении группы (скобки).

Вхождения = StringFunctionsExClientServer.MatchWildcard(ИсходныйТекст, "(?i)<name>(.*?)<\/name>", Истина);

Скачать файлы

Наименование Файл Версия Размер
Тест регулярных выражений 12
.epf 7,70Kb
08.02.15
12
.epf 1.0.0.1 7,70Kb Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. eugenie zheludkov (eugeniezheludkov) 09.02.15 03:35
блин ну почему я так невнимательно прочитал ? скачал, а ей же еще целую конфу качать нужно, 1С:Переводчик ... :(
for_sale; ekaruk; +2 Ответить
2. Тимофей Бугаевский (boogie) 09.02.15 07:59
Она показывает механизм, который в нём заложен.
3. Яков Коган (Yashazz) 09.02.15 08:35
Без обид, но про использование встроенных в 1С регулярок уже вроде писали... А тут ни подробностей, ничего, типа "иди качай конфу".
4. Сергей Старых (tormozit) 09.02.15 09:20
Слабо раскрыты преимущества и недостатки предлагаемого метода. Я всегда пользовался VBscript.RegExp, как и большинство. Неплохо бы провести сравнение по скорости, синтаксису, объектной модели, кроссплатформенности и т.д. с ним.
kiruha; artbear; Pr-Mex; AllexSoft; +4 Ответить
5. Тимофей Бугаевский (boogie) 09.02.15 09:40
Преимущество самое главное в том, что регулярные выражения реализованы исключительно на встроенном языке, поэтому не требуется ни внешних компонент, ни COM объектов, ни вызова команд ОС, работает на сервере и на клиенте, под любую ОС и любой тип клиента.
6. Юрий Гончарук (yukon) 09.02.15 11:59
Платформа до сих пор не поддерживает регулярные выражения, хотя они уже стали довольно востребованной возможностью в разных языках программирования.

Судя по всему разработчики платформы 1С не включают язык 1С в множество этих "разных языков программирования".

Хотя пример реализации регулярок на встроенном языке это, конечно, отличный пример madskills. На 1c-dn.com есть еще реализация парсера json, и работа с биткоинами на встроенном языке.
7. Сергей Старых (tormozit) 09.02.15 18:49
(5) boogie, очень хотелось бы узнать насколько медленнее оно работает.
8. Тимофей Бугаевский (boogie) 09.02.15 19:37
Определённо медленнее. Замеры можете сделать самостоятельно,
9. Яков Коган (Yashazz) 10.02.15 11:42
На каких объёмах тестировали? Известно, что на достаточно больших объёмах вызов WScriptShell вешает 1С-ку. У вас "верхняя граница" известна?
10. Тимофей Бугаевский (boogie) 10.02.15 11:49
Пока намертво не зависало, при желании можете эти тесты выполнить и поделиться результатом.
11. Сергей Старых (tormozit) 10.02.15 13:35
(9) Вешают только кривые выражения поиска. Но ограничение по размеру обрабатываемого текста у COM объекта VBScript.RegExp действительно есть. От чего зависит не понял, но у меня оно колеблется от 20 до 40 МБ. При его срабатывании выдается ошибка 0x8007000E (E_OUTOFMEMORY)(пример тут http://devtool1c.ucoz.ru/forum/2-270-1)
12. Тимофей Бугаевский (boogie) 10.02.15 18:40
Ну, кривые выражения нужно исправлять, это как кривой код в программе.
headMade; +1 Ответить
13. Sirruf (Sirruf) 12.02.15 13:40
Это же аццки медленно будет работать!
14. Тимофей Бугаевский (boogie) 13.02.15 08:09
Работает вполне терпимо, время работы зависит сложности выражения и объёма текста, журнал регистрации анализировать регулярным выражением конечно будет долго, это для регулярной работы и не стоит делать - быстрее загнать в БД и делают выборку. А если нужно разово что-то посмотреть или сделать условие проверки поля email, например, вполне. В Переводчике используется обширно для задания условий в словаре, для очистки HTML от лишних тегов, вставляемых Вордом, для поиска заголовков и картинок и др.
15. Тимофей Бугаевский (boogie) 13.02.15 08:10
Да, в режиме отладки работает на порядок медленнее, без отладки существенно быстрее - потому, что на встроенном языке и есть возможность поставить точку останова в любом месте.
16. for_sale for_sale (for_sale) 04.03.15 11:13
т.е. использование внешних компонент - это ограничение, а использование целой сторонней конфы - это не ограничение?
17. Тимофей Бугаевский (boogie) 04.03.15 12:36
Нет конечно - она ж на встроенном языке написана.
18. for_sale for_sale (for_sale) 04.03.15 13:04
(17) boogie, т.е. то, что она платная, что для скачивания даже бесплатной версии нужна регистрация, что нужна интеграция её с типовым решением, если вдруг надо что-то внедрять - это всё мелочи, главное, что она написана на языке 1С? :) отличная логика!
Зеленоград; +1 Ответить
19. Тимофей Бугаевский (boogie) 04.03.15 13:50
Где сказано, что она платная?
20. Тимофей Бугаевский (boogie) 04.03.15 13:51
Нужно иметь лицензию на платформу.
21. Евгений Стоянов (quick) 01.04.15 17:13
Хороший пример извращения, к сожалению неизбежного в 1С.
22. Алексей Олешко (retif) 03.03.16 22:24
Когда уже РегЕкспы в платформу добавят?????
23. Sergey Andreev (starik-2005) 03.03.16 22:34
Регулярки на встроенном языке используются для паттернов в XDTO-пакетах. Там есть офсеты. С помощью них можно как раз это легко провернуть.
Полагаю, авторы так и сделали.

(22) Да, включили, через офсеты в XDTO.
24. Sergey Andreev (starik-2005) 04.03.16 12:23
(22) retif, можно вот так сделать чисто средствами платформы проверку:

&НаКлиенте
Функция ПроверитьСтроку(Строка, Фасет)
    Чтение = Новый ЧтениеXML;
    Чтение.УстановитьСтроку(
                "<Model xmlns=""http://v8.1c.ru/8.1/xdto"" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xsi:type=""Model"">
                |<package targetNamespace=""sample-my-package"">
                |<valueType name=""testtypes"" base=""xs:string"">
                |<pattern>" + Фасет + "</pattern>
                |</valueType>
                |<ob jectType name=""TestObj"">
                |<property xmlns:d4p1=""sample-my-package"" name=""TestItem"" type=""d4p1:testtypes""/>
                |</objectType>
                |</package>
                |</Model>");

    Модель = ФабрикаXDTO.ПрочитатьXML(Чтение);
    МояФабрикаXDTO = Новый ФабрикаXDTO(Модель);
    Пакет = МояФабрикаXDTO.Пакеты.Получить("sample-my-package");
    Тест = МояФабрикаXDTO.Создать(Пакет.Получить("TestObj"));

    Попытка
        Тест.TestItem = Строка;
        Возврат Истина
    Исключение
        Возврат Ложь
    КонецПопытки;
    
КонецФункции
    
&НаКлиенте
Процедура Модель(Команда)
    
    Сообщить(ПроверитьСтроку("01.01.2012","\d{2}\.\d{2}\.\d{4}"));
    Сообщить(ПроверитьСтроку("01.01.20121","\d{2}\.\d{2}\.\d{4}"));
    
КонецПроцедуры
...Показать Скрыть
kuzyara; artbear; +2 Ответить 1
25. Артур Аюханов (artbear) 04.03.16 19:13
(24) Прикольная тема, сработало!
26. Артур Аюханов (artbear) 04.03.16 19:34
(23) Еще что интересного про ХДТО знаешь? поделись, пожалуйста.
27. Sergey Andreev (starik-2005) 04.03.16 21:43
(26) artbear, ну а что там надо знать-то? В моем коде просто создается фабрика на основе загруженной их XML модели, в которой определен тип с фасетом (шаблоном, задаваемым регулярным выражением), а потом при присваивании значения полю с данным типом платформа неявно вызывает проверку. В результате или все хорошо - и возвращаем истину, или все плохо возвращаем ложь. Как выгрузить модель в XDTO написано в статье "XDTO часть 3" - поиск Вам поможет.
28. Евгений Тимошенко (morfeus) 08.12.16 20:07
В статье написано что методика не использует COM объекты, а в конфигурации "Переводчик" идёт создание COM объекта. Кругом обман
29. Евгений Тимошенко (morfeus) 08.12.16 20:09
Ааа, неправ. Или ComОбъект, или кодом 1с-ным сделали. Сорри )
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа