Comments 73
Сам думал написать питоновский модуль для более приятной работы с регулярками, но пока руки не доходят.
Подскажите, пожалуйста, что это за метапеременные такие? Пытался гуглить "regex metavars", но безрезультатно.
Судя по названию, это позволяет использовать куски регулярок несколько раз, чего очень и очень не хватает. Но я так и не смог найти, как такое можно сделать — обратные ссылки и именованные группы матчат лишь тот конкретный текст, который они сматчили в первый раз.
Или вы имеете ввиду определение переменных с кусками регулярок в самом языке, из которого они вызываются, а потом конструирование из них финального выражения через подстановку?
man 3 pcrepattern, раздел subpatterns as subroutines.
Регулярка типа (sens|respons)e and \1ibility даст совпадение в случае sense and sensibility и response and responsibility, но не sense and responsibility. Если же использовать (sens|respons)e and (?1)ibility, то заматчится и sense and responsibility.
Не обязательно в коде это пихать — можно препроцессор использовать и внешние файлы, да и подсветка есть.
Никогда не задумывался на счет этих символов. Может циркумфлекс ассоциируется так, что он не полностью занимает пространство символьное, а доллар на всю строку, и вроде даже больше других символов.
У меня caret (который вы назвали circumflex) ассоциируется с CR (\r).
Сначала подумал, было, написать про «Владимирский астрал, эзотерика», но потом решил, что не буду.
Сайт не отвечает, видимо его постиг хабраэффект.
Для разъяснения и тестирования регекспов есть, например, отличный ресурс: https://regex101.com/
А вводить новый непонятный синтаксис регекспов — не слишком хорошая идея.
Не знаю, буду ли использовать, но запомню, что существует.
mov ax, 0 пришлось писать set first register to value zero.А регулярки читаются не сильно хорошо.
Остается вопрос того, стоит ли доверять человеку без подготовки править код, руководствуясь наивным пониманием синтаксиса. Зачастую это чревато возникновением сложноуловимых багов — например, неопытный программист на C или JS может написать
if(a = true) и долго удивляться, почему сравнение не работает, как надо.Во-первых он уменьшается примерно раза в два, ликвидировав неиспользуемые группировки и объединив перечисления. Во-вторых, экранирование в перечислениях не нужно. И получается вполне читабельно:
^[0-9a-z._%+-]+@[0-9a-z.-]+\.[a-z]{2,}$И, наконец, Прекратите проверять Email с помощью регулярных выражений!
После небольшой тренировки небольшие однострочные регулярки воспринимаются достаточно быстро. А вот словесный многострочный аналог требует больше времени для чтения.
Сложные выражения в SLR займут экран, воспринимать будет даже сложнее, чем открытый в отладчике (упомянутый выше regex101, например) оригинал.
В целом: за реализацию, конечно, жирный плюс, но, будет ли востребовано, покажет время. У меня сомнения.
Лучше всё же, использовать грамматики, а не "очеловечивать" регулярки. Например, для вашего парсера урлов можно запилить такую грамматику на grammar.tree:
URL is
PROTOCOL
string =://
DOMAIN
optional
string =:
PORT
PATH
optional QUERY
PROTOCOL is list-of LETTER
DOMAIN is
list-of
list-of LETTER
string =.
LETTER
list-of LETTER
PORT list-of DIGIT
PATH is
string =/
optional list-of symbol except =?
QUERY is
string =?
optional list-of symbol except =#
LETTER is symbol =abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
DIGIT is symbol =0123456789
А можно ссылочку? А то гугл выдает только хип-хоп дуэт.
А какой символ порекомендуете для маркера начала сырых данных?
И я не раз повторял, что "=" — не разделитель "ключа" и "значения". Я согласен, что символ равенства вводит в заблуждение и было бы правильнее использовать какой-либо другой символ, например "|", но он в разных раскладках набирается разными способами, что несколько фрустирует.
А учить там — с гулькин нос, по факту.
Отдельный язык для такой задачи кмк перебор. Т.е. пока не ясно, как это использовать для самостоятельных задач.
У Rebol/Red есть невероятно удобный и читабельный PEG диалект(parse).
Первый пример из статьи.
test: "superb@ya.ru"
digit: charset [#"0" - #"9"] ; еще один диалект.
letter: charset [#"a" - #"z" #"A" - #"Z"]
symbol: charset "._%+-"
rule: [
some [digit | letter | symbol]
"@"
2 [letter | "."] any [letter | "."]
]
parse test ruleОдно begin with, вместо циркумфлекса уже настораживает.
Очень помогает отлаживать сложные выражения.
Ну реально: Вот вы бы отказались от такого сервиса?
Вопрос насколько будет жизнеспособным, а это со временем увидим.
Классический сухой регекс:
/^(?:[0-9]|[a-z]|[\._%\+-])+(?:@)(?:[0-9]|[a-z]|[\.-])+(?:\.)[a-z]{2,}$/i
Это мусор, который генерирует библиотека что ли? Потому что в .NET я ручками написал бы так:
(?inx)
^
[ 0-9 a-z \._%\+- ] +
@
[ 0-9 a-z \.- ] +
\.
[ a-z ] {2,}
$Ну и что более читаемо: это или ваша портянка?
Хватит писать регулярные выражения. Используйте вербальные выражения

SRL — Simple Regex Language