[recovery mode] SRL — Simple Regex Language
/^(?:[0-9]|[a-z]|[\._%\+-])+(?:@)(?:[0-9]|[a-z]|[\.-])+(?:\.)[a-z]{2,}$/i
С новым вкусом SLR:
На пост заметка не тянет, но на новость вполне. Дабы не тянуть кота за хвост, я вынес суть выше хабраката. Теперь потяну. В духе Хабра-Твиттера, прошу любить и жаловать: simple-regex.com — создание регулярок простым языком.
Для начала, это не я придумал, к сожалению. Сайт на английском, статьи как таковой нет, поэтому я не могу представить вам перевод. Сегодня я заглянул в привычный PHP подреддит, и увидел там тему «I’ve built a SQL-like language that compiles to regular expressions — What do you think?», по-русски «Я создал SQL-подобный язык, который компилируется в регулярные выражения». Вот так, ни больше ни меньше. Как написано в одном комментарии «Поздравляю! Ты только что сделал одно из моих самых мистических умений устаревшим!» Поэтому спешу поделиться с Хабра-сообществом, дабы все были в курсе.
Да, это близкий к естественному языку способ создания регулярок. На сайте можно найти несколько примеров. Тот, что я привёл вверху — проверяет почтовые адреса.
А вот этот:
begin with capture (letter once or more) as "protocol",
literally "://",
capture (
letter once or more,
any of (letter, literally ".") once or more,
letter at least 2 times
) as "domain",
(literally ":", capture (digit once or more) as "port") optional,
capture (literally "/", anything never or more) as "path" until (any of (literally "?", must end)),
literally "?" optional,
capture (anything never or more) as "parameters" optional,
must end,
case insensitive
Служит для проверки URL, и компилируется в такую регулярочку, что Хабр даже не позволяет её правильно отобразить, поэтому я не могу её вставить, простите. Но в разделе примеров ещё много примеров. И на сайте они цветные, там читать удобнее, так что посетите, не пожалеете.
Чего на сайте я не нашёл, но что очень просится, так это реализация цепочки вызовов для задания условий. Но это есть в репозитории!
$query = SRL::startsWith()
->anyOf(function (Builder $query) {
$query->digit()
->letter()
->oneOf('._%+-');
})->onceOrMore()
->literally('@')
->anyOf(function (Builder $query) {
$query->digit()
->letter()
->oneOf('.-');
})->onceOrMore()
->literally('.')
->letter()->atLeast(2)
->mustEnd()->caseInsensitive();
Насколько это полезно покажет время. Но для начинающих программировать это явно очень упрощает тему знакомства с регулярками.
Я честно говоря, не знаю, кто автор этой штуки, но она выглядит весьма интересно. Тема на реддите размещена юзером AndroTux. Вот ссылка на репозиторий на ГитХабе. Тут можно видеть, что единственный контрибутор проекта — Karim Geiger, который разместил этот проект в репозитории компании tyvr.net, которая указана у него же в профиле. Видимо, это его же студия программистов, которые программируют за деньги. Желаю им удачи!
Комментарии (11)
31 августа 2016 в 09:14
0↑
↓
Просто заменить символы на слова? А зачем? Тот кому понадобится работать с регулярками — и так знает синтаксис. Тот кто не знает — ему и не нужно, скорее всего. Да и куда такую простыню в коде девать? А подсветка как?P.S. да и вообще, менять знаки на слова — у меня сразу возникают ассоциации с Turbo Pascal, и его begin, end…
31 августа 2016 в 09:19
+1↑
↓
Зачем — не знаю. Если работать через класс SLR, как в примере на ГитХабе, то будет и подсветка, и автокомплит в IDE.31 августа 2016 в 09:22
+2↑
↓
А то, что приятные глазу команды процессора в машинном коде заменены на всякие операторы и идентификаторы у вас неприятных ассоциаций не вызывает?)31 августа 2016 в 09:50
+1↑
↓
Читабельность важна.
Сам думал написать питоновский модуль для более приятной работы с регулярками, но пока руки не доходят.
31 августа 2016 в 09:23
–1↑
↓
Сначала подумал, было, написать про «Владимирский астрал, эзотерика», но потом решил, что не буду.
31 августа 2016 в 09:29
+3↑
↓
А почему нет? Мне нравится идея. Не думаю, что сам бы использовал, т.к. к регуляркам привык, но для новичков — вполне бы сгодилось.31 августа 2016 в 09:36
+1↑
↓
Картинку xkcd про единый стандарт уже постили?31 августа 2016 в 09:50
0↑
↓
Как средство обучения rx было бы, как мне кажется, вполне удобоваримо. Хотя для тех кто синтаксис уже освоил, вероятно будет неудобно.31 августа 2016 в 10:17
+2↑
↓
Сайт не отвечает, видимо его постиг хабраэффект.
Для разъяснения и тестирования регекспов есть, например, отличный ресурс: https://regex101.com/
А вводить новый непонятный синтаксис регекспов — не слишком хорошая идея.31 августа 2016 в 10:32
+1↑
↓
Главная проблема регекспов в том, что они write-only. Описанный в статье подход эту проблему решает. Хотя любители однострочников на перле негодуют, да.Не знаю, буду ли использовать, но запомню, что существует.
31 августа 2016 в 10:37
0↑
↓
Проблема трудночитаемости регулярок решается так же, как проблема трудночитаемости обычного кода — выравниванием и комментариями. Во многих языках поддерживается, но, к сожалению — не во всех.