Обновить

Комментарии 13

Как написать регулярное выражение, которое проверит, правильно ли расставленны скобки в арифметическом выражении?

(())()()(((()()))) - OK
(())) - не ОК
())(() - не ОК

НЛО прилетело и опубликовало эту надпись здесь

Вопрос был с подвохом.

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

POSIX regexp, кстати, нифига не регулярная грамматика. С возможностью ссылаться на уже разобранные части входного текста, она куда мощнее. Но и цена соответствующая, никакого O(n), где n - длина входного текста, она не гарантирует.

НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь

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

НЛО прилетело и опубликовало эту надпись здесь

Адреса электронной почты не регулярны

Смотря что считать адресом.

Если адрес целиком, в терминах RFC822 ("Vasya Pupkin vasily@pupkin.com"), то там такая неудачная грамматика, что она не только не регулярная, а еще и backtracking требуется, чтобы этот синтаксис правильно разобрать.

А в той части, которая имя@домен - что в этом не регулярного?

Да, я имел в виду именно RFC-822. А если даже и говорить только про local-part@domain, то они, кажентся, регулярны, но тоже имеют право быть quoted-strings, что не учтено в приведенных регулярках.

НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации