Comments 48
Сколько этим пользовался, а только сегодня узнал, что они называются опережающие и ретроспективные )
+7
Отдельное вам спасибо за уважение к русскому языку и попытку переода терминов. Хотя бы в заголовке.
+15
Раз такое дело: мало кто знает ещё о так называемых «possessive quantifiers». При этом они предоставляют довольно интересное поведение.
Почитать: www.regular-expressions.info/possessive.html
Почитать: www.regular-expressions.info/possessive.html
+4
В регулярках вообще много такого, что мало кто знает. В PCRE есть «глаголы» (VERBS), например. Про рекурсивные регулярки мало кто слышал почему-то и так далее.
+2
Смею предположить потому, что всегда проще написать две регулярки последовательно, вместо того, чтобы ломать мозг потенциальному поддерживателю кода.
+3
Это как сказать. Например, глагол «UCP» (так кажется, могу путать) нужен для корректной работы с UTF-8.
0
Чтобы использовать магическое слово «UCP» — не обязательно знать про «VERBS в PCRE», правда?
0
Собеседовал недавно человека, решаем задачку… Он в конце регулярного выражения ставит модификаторы isU
Спрашиваю «А зачем они нужны и что значат»?
Ответ — «Не знаю, они нужны чтобы все правильно работало, всегда их ставлю»
Спрашиваю «А зачем они нужны и что значат»?
Ответ — «Не знаю, они нужны чтобы все правильно работало, всегда их ставлю»
+1
Смешно, конечно.
Но я себя заставлял разбираться в PCRE года через три, после того, как начал пользоваться всякими регулярками. Просто болк — он педант, он шагу не ступит, пока не проверит поле вокруг на триста миль вперед на отсутствие мин. Это очень ценное качество, но оно не всем дано.
Но я себя заставлял разбираться в PCRE года через три, после того, как начал пользоваться всякими регулярками. Просто болк — он педант, он шагу не ступит, пока не проверит поле вокруг на триста миль вперед на отсутствие мин. Это очень ценное качество, но оно не всем дано.
0
Зато человек не жадный.
+5
Я не про модификаторы, я про «глаголы».
0
Неправильно. UCP — это и есть VERBS. Применяется он, например, так: /(*UCP)\w+/.
0
Рекурсивное регулярное выражение — это уже не регулярное выражение, а стековая машина. Это не делает их менее полезными, но важно понимать, что это уже не конечный автомат.
0
Рекурсивное регулярное выражение — это всё ещё регулярное выражение, пусть и не автомат. Где есть требование делать их конечным автоматом?
+3
Классическое использование термина «регулярное выражение» означает «выражение, описывающее некоторый регулярный язык». Это, как мы видим, не всегда так, но мою чуткую душу это коробит, так что вот и напоминаю.
0
UFO just landed and posted this here
Простите за банальность, но традиционно, про html и регекспы
Вас спасает надежда на то, что пользователь не будет злоупотреблять, но вообще когда-нибудь оно обязательно сломается ;)
Вас спасает надежда на то, что пользователь не будет злоупотреблять, но вообще когда-нибудь оно обязательно сломается ;)
+8
www.books.ru/books/regulyarnye-vyrazheniya-3-e-izdanie-fail-pdf-626982/?show=1 там еще много интересного есть :)
+1
Может лучше было использовать Markdown или другой движок? Пусть заморочка с абзацами (два пробела в конце строки или одна пустая), но зато готовый набор множества других «плюшек»
+1
Ага. Здравствуй, бухгалтер, теперь ты пишешь на маркдауне.
0
Изначально(лет 10 назад) на том сайте так и было, но с течением времени оказалось, что обычный HTML проще и удобнее.
Markdown у всех разный, а HTML — везде один :-)
Markdown у всех разный, а HTML — везде один :-)
0
Мне кажется, что стоит упомянуть, что данные проверки относятся к так называемым «позиционным» проверкам, т.е. они совпадают не с текстом, а с позицией в тексте. При этом текст не «поглощается», что позволяет матчить его другой частью регулярного выражения.
0
Можно еще вспомнить, что опережающие проверки можно использовать перед искомым выражением (там, где обычно пишут условия для ретроспективной проверки) для имитации логического оператора «И» в регулярных выражениях. Например,
(?=.*\d)(?=^[A-Z]).{8,}будет искать строки длиной не менее 8 символов, в которых есть хотя бы одна цифра И которые начинаются с прописной латинской буквы.
+3
Есть еще редко используемый модификатор — 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)
+4
Наверное стоило так же упомянуть, что есть так же разные диалекты (в одном из них эти проверки не работаю), которые используют разные языки. К примеру в JS ретроспективная проверка не работает :). Я сейчас уже не помню, всех тонкостей, но их много
+1
Там проблемы в основном с look-behind — это упомянуто. Look-ahead работает обычно везде.
Добавил про JS.
Добавил про JS.
0
Назовите хотя бы одну причину, почему не надо использовать нормальный html парсер, а пользоваться регексами, которыми невозможно нормально парсить context-free grammar?
-1
Причина проста: гвозди забивают молотком, а не микроскопом.
Именно парсить HTML (выкусывать ссылки, картинки и прочее) — конечно стоит парсером.
Заменять переводы строк — можно тем, что работает проще, быстрее и не требует поддержки.
Именно парсить HTML (выкусывать ссылки, картинки и прочее) — конечно стоит парсером.
Заменять переводы строк — можно тем, что работает проще, быстрее и не требует поддержки.
+4
Бред. Имеет смысл только для написанных на коленке приложениях для себя, или для очень небольших объемов html. Регексы, особенно чужие — write-only код, со всеми вытекающими.
0
В 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;
0
Sign up to leave a comment.
Опережающие и ретроспективные проверки в регулярных выражениях