Regexoop — как я решил переосмыслить regex и сделать поиск проще

Все разработчики знают что такое regex, но даже если вы никогда не программировали, я думаю вам тоже будет интересно. Некоторым возможно снесёт крышу, ведь это не telegram-бот. Вкратце, regex — поиск текста на основе шаблона. Текущий regex очень сложен и я решил сделать библиотеку которая сочетает в себе regex и ооп. В общем новый подход в написании regex.

Regexoop — как я решил переосмыслить regex и сделать поиск проще

Вначале я хотел бы сказать спасибо человеку c ником @Capitan, который напомнил мне идею с 12 проектами в год. Суть проста. 1 проект — 1 месяц.

Так я составил список своих проектов. Поняв, что многие из проектов требует какой либо поиск или экстрактор данных в табличные сущности, зародилась сакральная мысль. Вообще она пришла просто спонтанно. На следующий день решил сделать продукт. 🤷‍♀😉

Дабы не умереть под тяжестью груза предстоящих задач, я сразу очертил границы текущего продукта. Так я буду знать границы и успею хотя бы до нового года доделать. Так что же не так с regex?

Что не так с regex?

Regex появился очень давно. Верой и правдой служит по сей день. Это крутой инструмент. Однако на моей памяти использование regex разбивалось об следующие камни реальности:

  1. На разных платформах и языках regex имеет разную реализацию и степень детализированности. Не раз я встречался с тем, что одно и тоже регулярное выражение может вполне себе не работать на другом языке;
  2. Его сложно учить, нужно учиться думать как regex, а чаще всего regex учат в тот же момент когда он требуется;
  3. Его сложно читать — [Хх]([аоие])х?(?:\1х?)*|[Аа]х?(?:ах?)+
  4. Его сложно разрабатывать. Человек полагается на интуицию, а regex на свою логику.

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

Regexoop

Основная идея библиотеки заключается в снижении ментальной нагрузки на разработчика путём отделения параметров обработки от поискового шаблона.

Это даёт некоторые преимущества:

Правила как элемент

Вы больше не ограничены одной строкой, дробите свой шаблон на сколько угодно частей и работайте в своём контексте не парясь, что остальные шаблоны перестанут работать.

Rule test = new BasicRule() { Name = "root", Pattern = "Hello {world} Hello {world}", Start = Rule.Direction.start, Variables = new List<Rule> { new BasicRule() { Name = "world", Pattern = "World" } } }; List<string> res = new Regexoop.Regexoop(test).Input("Hello World Hello World").Find(); // ["Hello World Hello World"]

Также вы можете переиспользовать правила сколько угодно раз.

Параметры вне шаблонов

Rule test = new BasicRule() { Name = "root", Pattern = "Hello", Start = Rule.Direction.end, minRepeat = 2 };

Шаблоны остаются чистыми, т.к. параметры вынесены в свойства правила. При этом если вам нужны специфичные настройки «прямо тут», вы просто объявляете новое правило и вставляете в текущий шаблон.

Rule test = new BasicRule() { Name = "root", Pattern = "Hell{oooooooooooooooooooo}", Start = Rule.Direction.start, Variables = new List<Rule> { new BasicRule() { Name = "oooooooooooooooooooo", Pattern = "o", minRepeat = 1 //Будем искать все Hello у которых последняя буква повторяется несколько раз } } };

Функциональные требования концепта:

  • 3 режима работы: Все вхождения сразу, пошаговый режим, режим для полей ввода;
  • ~15 пользовательских параметров(4 есть), не включая системные для настройки обработки правила
  • Условия, рекурсии(есть), управление выводом

Сложно ли разрабатывать библиотеку?

Средний уровень сложности я бы сказал. Благодаря удобной .net экосистеме разработка просто одно удовольствие. Так как я C# изучаю всего месяц-два, приходится спрашивать у более опытных коллег в моменты затупа.

Однако разработка занимает довольно много времени. Документацию я написал за 3 дня, а вот реализация длится уже больше 3 недель. При этом очертил я всего лишь базовую функциональность regex. Скоро пойдут более сложные параметры и придётся ещё раз поработать над синтаксисом.

Так же надо ещё заниматься переводом на английский язык и в скором времени презентовать на зарубежных сайтах.

Ссылка на проект Regexoop

4040 показов
1.1K1.1K открытий
16 комментариев

Перефразируя классику:
Если у вас есть проблема и вы решили её с помощью регулярки - у вас теперь две проблемы.
Если у вас есть проблема и вы решили её с помощью слабо оттестированной обертки над регулярками без сообщества контрибьюторов и истории использования - у вас теперь три проблемы.

Ответить

А приведите пример кода маломальски сложного регекспа.
И какова ЦА? Кто и для каких целей сможет использовать это?
.
У меня такое ощущение, что пользоваться вашим продуктом будет ни чуть не проще, чем нативным решением, надо будет очень хорошо себе представлять, что именно ты делаешь и как оно должно работать. Пока это изучаешь, совсем не сложно заодно и синтаксис регекспа запомнить.

Ответить

Именно данное решение для ЦА разработчиков, т.к. писать правила всё же не так просто как я думал.

Можете глянуть концепт валидации домена, там конечно где начинается second_level на текущий момент надо переписать, чтобы [a-zA-Z0-9-] лежало в своём правиле и было так "{name_domain}.".
https://github.com/askolt/Regexoop/blob/main/Guide/Examples/Domain%20validation.md

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

Ответить

Гораздо легче регексп постичь или даже вообще обойтись декларативным кодом с большим кол-вом ветвлений (местечковый парсер-лексер), чем писать такие монструозные конструкции, которые предлагает писать ваша либа.

Понимаю, для фана такое интересно сделать бывает. Но на практике это совершенно неприменимо

Ответить

Уточните чуть подробнее в чем суть: "Вначале я хотел бы сказать спасибо человеку c ником @Capitan, который напомнил мне идею с 12 проектами в год. Суть проста. 1 проект — 1 месяц."

Ответить

Так всё написано же, ищите юзера с указанным ником: https://vc.ru/u/794398-capitan

Ответить

Похоже на классы в С++

Ответить