Pull to refresh

Comments 23

Полезное напоминание, спасибо. Как раз недавно «нырял» в регулярки, после праздников опять :)
Вот очень классная статья по регекспам. Рассматривается, в частности, и описанная проблема, а также имплементация регекспов с помощью конечного автомата: swtch.com/~rsc/regexp/regexp1.html
И вот заодно дико классная классическая книжка по регекспам и не только. Помимо прочего, рассказывают, почему нельзя парсить Html с помощью regex: en.wikipedia.org/wiki/Introduction_to_Automata_Theory,_Languages,_and_Computation
Спасибо за ссылку, это великолепно :)
интересно, есть где-нибудь перевод? а то тыкать новичков в английский текст бесполезно…
Можете ли вы в двух словах сказать почему?
Если строго, то html по классификации Хомского принадлежыт к типу 2 (контекстно-свободные), в тоже время регулярки — 3 тип. То есть html нельзя описать (а значит и пропарсить) с помощью regexp.
Я так понимаю, здесь потерялась частица не?

Любая контекстно-свободная грамматика может быть легко преобразована в вид, в котором правила состоят только из лево-регулярных или право-регулярных (для контекстно-свободных грамматик допустимо наличие тех и других одновременно). Следовательно, такие грамматики могут выразить все контекстно-свободные языки. Регулярные грамматики могут содержать либо лево-регулярные правила, либо право-регулярные, но не оба вида одновременно. Поэтому они могут описать лишь подмножество языков, называемых регулярными языками.
А, нет, википедия не врёт, просто неправильно прочитал.
Я думаю что regexp применяют к html в случае когда нужно выкусить кусок текста, а не пропарсить весь документ. В таком применении он бывает удобнее чем html/xml парсеры.
другой инструмент.
Было на Хабре с подробными объяснения, что плохо и как надо.
Атомарная группировка, или Ни шагу назад!

Вот несколько цитат оттуда, чтобы показать, что речь о том же.

На собеседовании Ивану дали такую задачу. Написать регекс, который матчит выражение в круглых скобках (...), причем внутри скобок может быть множество выражений в других круглых скобках, вероятно, вложенных.

Однако, регекс не должен матчить такую часть цепочки, в которой скобки не сбалансированы (открытые скобки не закрываются или, наоборот, закрываются скобки, которые вовсе не были открыты).
Далее выписываются рассуждения гипотетического Ивана и составленное им регулярное выражение.
Иван проверяет регекс на нескольких примерах цепочек (благо, на интервью разрешено прогонять тестовые программы, нельзя лишь заходить в Интернет и читать документацию)

и регекс с ними со всеми справляется как положено. Довольный, Иван показывает решение интервьюеру. Happy end, занавес? Но почему статья названа так, как она названа??
Интервьюер спрашивает, что должен (если должен) найти регекс в следующей цепочке:
(you're gonna fail sonny unless you correct it (your regex)
Прочитав и побледнев, Ванюша, тем не менее, не моргнув глазом отвечает, что, раз 1-я скобка нигде не закрывается, регекс должен найти 2-ю пару скобок: (your regex). Его просят проверить. Иван вбивает эту цепочку в свой проверочный скрипт

Проверив синтаксис, Иван запускает скрипт и… и ничего не происходит, скрипт как будто «зависает». Не говорит ни «да», ни «нет». Иван и интервьюер молча смотрят на это секунд 10. За это время Иван из бледного становится ярко-розовым: он уже явно чувствует подвох. Но чтО он сделал не так?? В этот момент лэптоп, на котором был запущен (и до сих пор почему-то не завершился) скрипт, начинает отчетливо гудеть, хотя до тех пор работал бесшумно.

А далее объясняется, как на самом деле работает это регулярное выражение (постоянно отступая назад), и повествуется о пользе атомарных группировок.
Спасибо за линк. Добавил в пост.
Some people, when confronted with a problem, think «I know, I'll use regular expressions.» Now they have two problems.

© Jamie Zawinski

Хотя иногда, конечно, без регулярных выражений не обойтись.
Не обойтись? А чем не устраивает PEG?
Тем, что я не знаю (с настоящего момента — не знал) о его существовании.
Спасибо за наводку — добавил в readlater.
А если взять какой-нибудь BusyBeaver в 6 состояний и конвертнуть в регэкспу? :) Надо будет посчитать на досуге.
Мне кажется, это не сразу получится: busy beaver--это пример машины тьюринга; а регекспы описываются конечными автоматами, и уступают в мощности машинам тьюринга. Вот тут про это есть.
Сначала, хотел написать WTF? Запустил на Java проверил различные варианты и мда… действительно не работает.

Вопрос как же так? Обычная регулярка. Простой Недетерминированный автомат => Детерминированный.
Причем тут бэктрекинг??? В автоматах.

Как видим, время исполнения растет экспоненциально.

только если нет оптимизации для такого случая)
$ time perl -E 'my $s = "a" x 1_000_000; say $s =~ /(a+)*b/'

perl -E 'my $s = "a" x 1_000_000; say $s =~ /(a+)*b/'  0.01s user 0.01s system 85% cpu 0.016 total
UFO just landed and posted this here
UFO just landed and posted this here
Sign up to leave a comment.

Articles