Как стать автором
Обновить

Мой первый Pet-проект — Regexoop

Время на прочтение4 мин
Количество просмотров7.1K

Мой первый Pet-проект - Regexoop

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

Немного о себе. Я всегда был противником бесплатного труда, меня так воспитали. Работая только за деньги и только с чужими проектами я погорел. Это ужасное чувство тошноты. Я пробовал делать проекты для себя, но ни с кем не делился. Мне казалось, мою идею украдут, хотя идеи были на уровне игр про караваны. Я пытался делить шкуру неубитого медведя со своим эго. Оно побеждало.

Спустя некоторое время я увидел интересный метод "12 проектов за 12 месяцев". Суть метода состоит в том, что ты каждый месяц делаешь 1 продукт и показываешь его людям. Неважно насколько он готов. Ты можешь эти продукты выпускать как хочешь, хочешь за деньги, хочешь бесплатно. Я выбрал путь для этого проекта - бесплатно.

Суть проекта

Regexoop - переосмысление подхода написания regex. 30 сентября я подумал - "Хм, regex такой сложный. НУ ПОЧЕМУ? Может его можно сделать как-то проще?". Начав ровно 1 октября, я 3 дня писал документацию. Этот объем документации написанной за 3 дня, я разрабатываю уже 3 недели и не дошёл даже до половины. Чего уже говорить о настоящей мощи regex.

Концепт кода:

var rules = new { 
    pattern = "{second_level}{first_level}",
    start = "end",
    first_level = new {
        pattern = "[a-z]",
        minLength = 2,
        maxLength = 3,
    },
    second_level = new {
        pattern = "[a-zA-Z0-9-].", //а вот тут ошибка, но это ведь набросок
        minLength = 2,
        maxLength = 63,
        maxRepeat = 5,
        minRepeat = 0,
        symbolsRules = new {
            "-" = new { repeat: 0 }
        }
    }
};

var er = new Regexoop(rules).Input("https://docs.microsoft.com").Find()
Console.WriteLine(er); //docs.microsoft.com

Настоящий шаблон regex представляет собой мешанину из текста с параметрами и то, что показано в концепте в настоящем regex выглядит примерно так:

^(?!-)[A-Za-z0-9-]+([\\-\\.]{1}[a-z0-9]+)*\\.[A-Za-z]{2,6}$"

Это ещё простой шаблон валидации доменов. Бывают сложнее.

Техническая реализация

Несмотря на долгий опыт в PHP, я выбрал C# как основной язык для этого проекта. В текущем состоянии .net на голову выше экосистемы PHP. Ты просто садишься, открываешь Visual Studio 2019 и всё как по масти работает. Банальный отлов ошибок при компиляции вырезает 90% глупых ошибок.

Библиотека работает на C# под .net 5.

Cценарий работы c библиотекой

  1. Создаёте новый объект правил BasicRule и заполняете публичные свойства правила. Правила можно складывать в друг-друга как матрёшку, но дочерние правила перестают быть самостоятельными и свой результат отдают родительскому правилу;

  2. Создаёте объект Regexoop и помещаете в конструктор свои правила;

  3. Вызываете метод Input() для помещения исходного текста для поиска;

  4. Вызываете один из трех режимов работы методов для поиска текста.

Rule test = new BasicRule()
{
    Name = "root",
    Pattern = "Hello",
    Start = Rule.Direction.start
};
List res = new Regexoop.Regexoop(test).Input("Hello World").Find();
//res: Hello

Да, тут я тоже ловлю некоторый фейспалм из-за "new Regexoop.Regexoop", но в скором времени хочу это исправить. Однако же работает. 😁

Принцип разбора текста

Исходный текст обрабатывается посимвольно согласно шаблону правил. Вот кусок кода текущего роутера для метода Find()

while(_input.IsComplete() == false) //тут думаю ясно что это исходный текст
{
    _input.MoveCursor(1); //курсор передвинется только в том случае если был запрошен исходный текст
    Rule.Status stepResult = _rule.Peek().ParseSymbol(_input); 
    ...
}

Обработка правил является стеком вызовов правил. Вы спросите зачем, вот пример.

Rule test = new BasicRule()
{
    Name = "root",
    Pattern = "Hello {world} Hello {world}",
    Start = Rule.Direction.start,
    Variables = new List {
                                new BasicRule() { 
                                        Name = "world",
                                        Pattern = "World"
                                    }
                            }

};
List res = new Regexoop.Regexoop(test).Input("Hello World Hello World").Find();
//res: Hello World Hello World

Встречая команду {world} при парсинге шаблона, правило помечает необходимость переадресации на другое правило и помещает в специально отведённое место объект с необходимым правилом, а роутер считывая необходимость переадресации, замораживает текущее исполнение вызова правила и помещает в стек вызовов новое правило. Когда новое правило завершит свою работу со статусом Complete, результат дочернего правила будет присвоено родительскому правилу и родительское правило продолжит работу с места остановки. В общем простая работа стековой машины вызовов.

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

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

Pet-проект это тоже работа

Несмотря на получаемое удовольствие от проекта. Я не могу сказать что это просто. Если на обычной работе программистом ты делаешь только свою часть и в 18:00 уходишь в закат, то здесь всё не так. Даже не представляю сколько времени данный проект

В данном проекте я директор, pr менеджер, pm, team leader, разработчик, тестировщик, системный администратор и сам себе кофе делаю.

Уже 3 недели я выкладываю исходники на Github и только после оформления как nuget пакет я увидел что кто-то качает библиотеку. Наверное боты. 100%. Поэтому без рекламы ваши проекты никому не интересны, даже бесплатно. Пилите караваны и не бойтесь что их кто-то украдёт.

Жду от сообщества критику и предложения по развитию библиотеки.

Теги:
Хабы:
Всего голосов 25: ↑15 и ↓10+5
Комментарии26

Публикации

Истории

Работа

Ближайшие события