Comments 48
Сколько этим пользовался, а только сегодня узнал, что они называются опережающие и ретроспективные )
Отдельное вам спасибо за уважение к русскому языку и попытку переода терминов. Хотя бы в заголовке.
Раз такое дело: мало кто знает ещё о так называемых «possessive quantifiers». При этом они предоставляют довольно интересное поведение.
Почитать: www.regular-expressions.info/possessive.html
Почитать: www.regular-expressions.info/possessive.html
В регулярках вообще много такого, что мало кто знает. В PCRE есть «глаголы» (VERBS), например. Про рекурсивные регулярки мало кто слышал почему-то и так далее.
Смею предположить потому, что всегда проще написать две регулярки последовательно, вместо того, чтобы ломать мозг потенциальному поддерживателю кода.
Это как сказать. Например, глагол «UCP» (так кажется, могу путать) нужен для корректной работы с UTF-8.
Чтобы использовать магическое слово «UCP» — не обязательно знать про «VERBS в PCRE», правда?
Собеседовал недавно человека, решаем задачку… Он в конце регулярного выражения ставит модификаторы isU
Спрашиваю «А зачем они нужны и что значат»?
Ответ — «Не знаю, они нужны чтобы все правильно работало, всегда их ставлю»
Спрашиваю «А зачем они нужны и что значат»?
Ответ — «Не знаю, они нужны чтобы все правильно работало, всегда их ставлю»

Смешно, конечно.
Но я себя заставлял разбираться в PCRE года через три, после того, как начал пользоваться всякими регулярками. Просто болк — он педант, он шагу не ступит, пока не проверит поле вокруг на триста миль вперед на отсутствие мин. Это очень ценное качество, но оно не всем дано.
Но я себя заставлял разбираться в PCRE года через три, после того, как начал пользоваться всякими регулярками. Просто болк — он педант, он шагу не ступит, пока не проверит поле вокруг на триста миль вперед на отсутствие мин. Это очень ценное качество, но оно не всем дано.
Зато человек не жадный.
Я не про модификаторы, я про «глаголы».
Неправильно. UCP — это и есть VERBS. Применяется он, например, так: /(*UCP)\w+/.
Рекурсивное регулярное выражение — это уже не регулярное выражение, а стековая машина. Это не делает их менее полезными, но важно понимать, что это уже не конечный автомат.
Рекурсивное регулярное выражение — это всё ещё регулярное выражение, пусть и не автомат. Где есть требование делать их конечным автоматом?
Классическое использование термина «регулярное выражение» означает «выражение, описывающее некоторый регулярный язык». Это, как мы видим, не всегда так, но мою чуткую душу это коробит, так что вот и напоминаю.
Простите за банальность, но традиционно, про html и регекспы
Вас спасает надежда на то, что пользователь не будет злоупотреблять, но вообще когда-нибудь оно обязательно сломается ;)
Вас спасает надежда на то, что пользователь не будет злоупотреблять, но вообще когда-нибудь оно обязательно сломается ;)
www.books.ru/books/regulyarnye-vyrazheniya-3-e-izdanie-fail-pdf-626982/?show=1 там еще много интересного есть :)
Может лучше было использовать Markdown или другой движок? Пусть заморочка с абзацами (два пробела в конце строки или одна пустая), но зато готовый набор множества других «плюшек»
Ага. Здравствуй, бухгалтер, теперь ты пишешь на маркдауне.
Изначально(лет 10 назад) на том сайте так и было, но с течением времени оказалось, что обычный HTML проще и удобнее.
Markdown у всех разный, а HTML — везде один :-)
Markdown у всех разный, а HTML — везде один :-)
Мне кажется, что стоит упомянуть, что данные проверки относятся к так называемым «позиционным» проверкам, т.е. они совпадают не с текстом, а с позицией в тексте. При этом текст не «поглощается», что позволяет матчить его другой частью регулярного выражения.
Можно еще вспомнить, что опережающие проверки можно использовать перед искомым выражением (там, где обычно пишут условия для ретроспективной проверки) для имитации логического оператора «И» в регулярных выражениях. Например,
(?=.*\d)(?=^[A-Z]).{8,}будет искать строки длиной не менее 8 символов, в которых есть хотя бы одна цифра И которые начинаются с прописной латинской буквы.
Есть еще редко используемый модификатор — x. Он позволяет писать комментарии и игнорирует переносы строк:
$str = 'test-pcre-comments76755';
preg_match('
~
^ #начало строки
(\w+) #слово
.+? #любая последовательность (не жадная)
(\d+) #число
$ #конец строки
~x
', $str, $matches);
var_dump($matches);
array
0 => string 'test-pcre-comments76755' (length=23)
1 => string 'test' (length=4)
2 => string '76755' (length=5)
Наверное стоило так же упомянуть, что есть так же разные диалекты (в одном из них эти проверки не работаю), которые используют разные языки. К примеру в JS ретроспективная проверка не работает :). Я сейчас уже не помню, всех тонкостей, но их много
Там проблемы в основном с look-behind — это упомянуто. Look-ahead работает обычно везде.
Добавил про JS.
Добавил про JS.
Назовите хотя бы одну причину, почему не надо использовать нормальный html парсер, а пользоваться регексами, которыми невозможно нормально парсить context-free grammar?
Причина проста: гвозди забивают молотком, а не микроскопом.
Именно парсить HTML (выкусывать ссылки, картинки и прочее) — конечно стоит парсером.
Заменять переводы строк — можно тем, что работает проще, быстрее и не требует поддержки.
Именно парсить HTML (выкусывать ссылки, картинки и прочее) — конечно стоит парсером.
Заменять переводы строк — можно тем, что работает проще, быстрее и не требует поддержки.
Бред. Имеет смысл только для написанных на коленке приложениях для себя, или для очень небольших объемов html. Регексы, особенно чужие — write-only код, со всеми вытекающими.
В Perl еще есть нечасто используемый ключик e, который позволяет запускать код Perl и использовать возвращаемое значение в подстановке:
# Преобразовываем urlencoded строки в читаемые utf8
s/ ( (?: %[0-9A-F]{2} )+ )/ { my $a1 = uri_unescape($1); utf8::decode($a1); $a1; } /gex;
# Преобразовываем urlencoded строки в читаемые utf8
s/ ( (?: %[0-9A-F]{2} )+ )/ { my $a1 = uri_unescape($1); utf8::decode($a1); $a1; } /gex;
Sign up to leave a comment.
Опережающие и ретроспективные проверки в регулярных выражениях