vak: (Default)
Serge Vakulenko ([personal profile] vak) wrote2022-06-06 05:14 pm

Выражайтесь регулярнее, господа!

Народ предлагает новый язык rulex для регулярных выражений. Старый язык regex уже достал: в нём никто ничего не понимает. :)

Новый язык гораздо более дружественный для человека. В нём незначащие пробелы, есть комментарии и переменные. Пример с переменными:
let operator = '+' | '-' | '*' | '/';
let number = '-'? [digit]+;

number (operator number)*
Ещё один пример: проверка паролей. Вот регулярное выражение, проверяющее, что в строке есть как минимум одна большая буква, одна маленькая, одна цифра, один знак препинания и всего не меньше восьми символов. Попробуйте разобраться.
^(?=[\S\s]*?\d)(?=[\S\s]*?\p{Ll})(?=[\S\s]*?\p{Lu})(?=[\S\s]*?[\pP\pS])[\S\s]{8}
То же самое на новом языке rulex:
<%
(>> [cp]* [digit])
(>> [cp]* [Ll])
(>> [cp]* [Lu])
(>> [cp]* [P S])
[cp]{8}
Введение в язык: introduction

Полное описание языка: rulex-rs.github.io/docs
juan_gandhi: (Default)

[personal profile] juan_gandhi 2022-06-07 03:13 am (UTC)(link)

Ха, имеет смысл. На перле когда-то регулярки можно было писать вполне нормальные (с комментариями) - но то перл.

А этот же должен в регулярку и компилироваться.

Edited 2022-06-07 03:16 (UTC)
norian: (Default)

[personal profile] norian 2022-06-07 08:04 am (UTC)(link)
зачем его компилять в регулярку когда можно сразу в какой-нть ллвм
juan_gandhi: (Default)

[personal profile] juan_gandhi 2022-06-07 10:56 am (UTC)(link)

Регулярка интерпретируется везде, и в джаве, и в шелле, и в джаваскрипте.

norian: (Default)

[personal profile] norian 2022-06-07 11:44 am (UTC)(link)
интерпретаторы медленные, джава скорее всего компиляет в байткод, а ллвм тот же байткод только в профиль

[personal profile] ichthuss 2022-06-14 10:36 pm (UTC)(link)
Речь о том, что если эту штуку транспайльнуть в обычные регулярки, то их потом можно засунуть в любой язык, не дожидаясь, пока разработчики этого любого языка воплотят регулярки новомодные.

[personal profile] iamjaph 2022-06-07 04:15 am (UTC)(link)
Но ведь "[\S\s]" - это просто ".", а "*?" - это просто "*"!

^(?=.*\d)(?=.*\p{Ll})(?=.*\p{Lu})(?=.*[\pP\pS]).{8}

На perl можно включить режим "незначащие пробелы и комментарии":

^
(?=.*\d)
(?=.*\p{Ll})
(?=.*\p{Lu})
(?=.*[\pP\pS])
.{8}

Edited 2022-06-07 04:20 (UTC)
kondybas: (Default)

[personal profile] kondybas 2022-06-07 11:23 am (UTC)(link)
У \S и \s есть некоторые нюансы с новой строкой, *? от просто * отличается нежадностью.

[personal profile] iamjaph 2022-06-07 01:01 pm (UTC)(link)
Так в rulex варианте нет слова lazy!

Новая строка для проверки пароля?
Кстати нюанс, с новой строкой, в перл также регулируется модификатором.

Я о том, что сравнение необъективное.
ordinary_joe_backup: (Default)

[personal profile] ordinary_joe_backup 2022-06-07 06:40 am (UTC)(link)
а вот давно пора!
mikerrr: (Default)

[personal profile] mikerrr 2022-06-07 06:40 am (UTC)(link)
о! наконец-то!
norian: (Default)

[personal profile] norian 2022-06-07 07:59 am (UTC)(link)
хде-то что-то большое сдохло наверно

потому как регекспы идеологически не совпадают ни с декларативными, ни с функциональными йазыками и с сиквелом тоже и моск должен переключацца каждый раз заново и помнить что все эти бэкслэши значат

ну и всякие L и S тоже по хорошему надо заменить на [upper] [lower] [special], чо место жалеть

и добавить предикат [exists] который находит N паттернов и вываливаецца, ну и булеву логику

((>> [exists] [digit] [3]) &
(>> [exists] [upper]) &
(>> [exists] [lower] [2])) |
((>> [exists] [special]) &
[count>=]{8})
Edited 2022-06-07 08:19 (UTC)
juan_gandhi: (Default)

[personal profile] juan_gandhi 2022-06-07 10:58 am (UTC)(link)

Есть же разница между регулярными языками и контекстно-свободными. Какая еще булева логика, какие предикаты...

norian: (Default)

[personal profile] norian 2022-06-07 11:43 am (UTC)(link)
туда уже булева логика воткнута как AND связка, осталось только её повернуть лицом к
juan_gandhi: (Default)

[personal profile] juan_gandhi 2022-06-07 04:02 pm (UTC)(link)

Если скобки добавить, то язык будет нерегулярный.

doldonius: (Default)

[personal profile] doldonius 2022-06-07 06:24 pm (UTC)(link)
"Существует 10 несовместимых стандартов. Давайте придумаем стандарт, который устроит всех!"
doldonius: (Default)

[personal profile] doldonius 2022-06-07 07:09 pm (UTC)(link)
Ага. Вот, стало быть, откуда это.

[personal profile] ichthuss 2022-06-14 10:39 pm (UTC)(link)
Для тех, кто вставляет XKCD без alt-текста, в аду... А, ладно.

[personal profile] dijifi 2022-06-15 04:08 pm (UTC)(link)
На бескурсорных платформах все норм. Жмите на капу, переходите по линку, и будет вам счастье.