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