Регулярные выражения, способ 3-й

28.04.18

Разработка - Запросы

На момент написания статьи на Инфостарте предлагали 2 способа проверки строки на соответствие шаблону. Первый с использованием внешних компонент, второй с использованием фабрики XDTO (голый парсинг текста не считаем). Предлагаю третий - с использованием языка запросов.

Откровенно говоря, этот способ работает дольше и предлагает меньшее богатство инструментов для создания шаблона, но тем не менее кому-то может показаться интересным, кроме того, не помешает знать о нем для общего развития. Пишем запрос:

|ВЫБРАТЬ
|    ВЫБОР
|        КОГДА &Строка ПОДОБНО &Шаблон
|            ТОГДА ИСТИНА
|        ИНАЧЕ ЛОЖЬ
|    КОНЕЦ КАК ЕстьСоответствие

Устанавливаем значения параметров и выполняем. В результате всегда будет 1 строка, содержащая в реквизите ЕстьСоответствие булево значение.

Для описания шаблона можно использовать следующие выражения:

  • %: любое количество произвольных символов 
  • _: один произвольный символ
  • []: любой одиночный символ из перечисленных внутри квадратных скобок.
  • [^]: любой одиночный символ, кроме тех, которые перечислены следом за значком отрицания
  • \: экранирование управляющих символов

Например:

  • "%АБВ%" - строка, в которой встречается последовательность "АБВ"
  • "%[А-Я1-5]%" - строка, в которой встречается любая киррилическая буква в верхнем регистре или цифра от 1 до 5
  • "%[АВБ]%" - строка, в которой встречается буква А, Б или В
  • "%[^К-Н]%" - строка, в которой не встречаются символы К, Л, М, Н.
  • "[0-3][0-9] ЯНВАР[ЬЯ] 20[0-9][0-9]" - дата в январе 21-го века )

Далее, можно писать множественные сравнения, собирать текст запроса из многих условий и вообще использовать как фантазия подскажет. Удачи!

См. также

SALE! 15%

Инструментарий разработчика Роли и права Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    159548    874    399    

862

Запросы Программист Бесплатно (free)

Увидел cheatsheet по SQL и захотелось нарисовать подобное, но про запросы.

18.10.2024    9896    sergey279    18    

64

Запросы Программист Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    5187    XilDen    36    

80

Запросы Программист Запросы Бесплатно (free)

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

16.08.2024    7913    user1840182    5    

28

Математика и алгоритмы Запросы Программист Платформа 1С v8.3 Запросы Бесплатно (free)

Рассмотрим быстрый алгоритм поиска дублей с использованием hash функции по набору полей шапки и табличных частей.

08.07.2024    2396    ivanov660    9    

22

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    8698    implecs_team    6    

47

Запросы Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Часто поступают задачи по произвольному распределению общих сумм. После распределения иногда пропадают копейки. Суть решения добавить АвтоНомерЗаписи() в ВТ распределения, и далее используя функции МАКСИМУМ или МИНИМУМ можем положить разницу копеек в первую или последнюю строку знаменателя распределения.

11.04.2024    3392    andrey_sag    10    

36
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ImHunter 327 28.04.18 12:26 Сейчас в теме
Дык... В упр. формах - это только с переходом на сервер можно сделать. Да еще и будет обращение в БД.
Так-то да, запросное подобие по-проще регулярок. Но накладные расходы, мне кажется, будут слишком велики.
2. m-rv 972 28.04.18 13:06 Сейчас в теме
(1) ну понятно, что это не клиентский вариант )
на самом деле я использую этот вариант потому, что он (как не странно) дает выигрыш в производительности в специфических условиях: у меня множество строк (~1000) и множество шаблонов (~100) по которым их надо проверить. и запрос позволяет проверить такое "одним махом", другие варианты - только циклом.
3. ImHunter 327 28.04.18 13:12 Сейчас в теме
(2) Т.е., динамически генеришь огромный запрос? Хм... Тоже надо подумать в эту сторону.
Как раз занимаюсь разбором данных (экселей). Замаялся и уже в сторону НС начал думать;)
4. m-rv 972 28.04.18 13:16 Сейчас в теме
(3) да, именно так и именно при разборе экселя )))
5. Fragster 1151 28.04.18 14:26 Сейчас в теме
Но ведь это даже близко не регулярные выражения, которые все имеют ввиду https://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1­%8B%D0%B5_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D­1%8F
tormozit; Aphanas; dmpas; +3 Ответить
7. m-rv 972 28.04.18 16:07 Сейчас в теме
(5) да, с манипуляциями беда, но у меня ощущение, что когда «все» говорят про регулярные выражения - имеют ввиду прежде всего поиск по шаблону, а с этим все ок
9. Fragster 1151 28.04.18 20:38 Сейчас в теме
(7) ну выделите с помощью выражений шаблона запроса 1с, например, число с разделителем из строки, эдакий аналог [1-9]\d*(((,|\.)\d{2})|(( )\d{3}))*
1.23, 1 000.00, 1 000 000.23 и т.п. (реально используемый пример для парсинга инвойсов из пдф)
10. m-rv 972 28.04.18 21:06 Сейчас в теме
(9) вы пытаетесь сказать, что инструментарий ненастолько богат, как, скажем в случае использования xdto?
11. Fragster 1151 03.05.18 10:18 Сейчас в теме
(10) Что-то типа того. Для себя решил что буду использовать для винды vbscript, в кроссплатформенном варианте - командную строку или свой http-сервис
8. palsergeich 28.04.18 19:58 Сейчас в теме
Штука конечно интересная, но на более менее большой таблице по производительности полный швах.
Единственное что быстро работает это конструкция ТЕКСТ% на строках ограниченной длинны попадающих в индекс по плану запроса, все остальное от лукавого.
Если такая задача становится - решать ее желательно другими методами.
Скажем так на жалких 100 000 позициях номенклатуры решение этой задачи через полнотекстовый поиск более чем на порядок быстрее, но там есть ньюансы.
А есть области где номенклатурные позиции измеряются миллионами (практически любое направление связанное с ремонтом, для каждой модели свой номенклатурный каталог)
Но если задача стоит в разборе таблицы, находящейся в памяти, как описано здесь в комментариях, то решение вполне себе приемлимо, но встает вопрос, а не проще напрямую через ADO подключится к екселю и выполнить запрос на его стороне, по своему опыту - 250 000 строк екселя запросом с отбрами и группировками выполнились за единицы секунд.
serverstar; +1 Ответить
15. serverstar 69 09.02.22 13:49 Сейчас в теме
12. jONES1979 03.05.18 11:59 Сейчас в теме
... И привести бы ещё ссылки на первые оба способа
13. starik-2005 3088 03.05.18 12:45 Сейчас в теме
(12) https://infostart.ru/public/464971/ - 2-й способ. Первый - это просто внешняя компонента от M$ (и других, кто умеет на C писать)..
14. МихаилМ 07.05.18 13:50 Сейчас в теме
в скд тоже есть оператор LIKE . и на сервер данные гонять не нужно. к тому же в вт не все типы колонок можно поместить, в в скд все.
более того : оператор like субд зависим .
16. user1393353 11 15.02.23 08:23 Сейчас в теме
Не работает, у меня например вот такое выражение "Менеджер-кассир+( [0-9]{1,2})?"
Оставьте свое сообщение