Личные инструменты
В других энциклопедиях
cnt

Regexp

Материал из Lurkmore

Перейти к: навигация, поиск
В эту статью нужно добавить как можно больше жадных квантификаторов.
Также сюда можно добавить интересные факты, картинки и прочие кошерные вещи.
Я нихуя не понял!
В этой статье слишком много мусора, что затрудняет её понимание.
Данный текст необходимо очистить, либо вообще снести нахуй.


«

Я не являюсь сторонником такого кода, в котором нарисован единственный регэксп в пару-тройку-другую сотен символов длиною, который не в подъем уму уразуметь…

»
Мицгол


Регэксп (яп. 正規表現, евр. ביטוי רגולרי, он же RegExp, он же RegEx, он же Регулярка) — программистская аббревиатура на термин «Regular Expression», что означает «Регулярное выражение». Сей термин восходит корнями к дискретной математике и означает он некоторую систему лексического анализа текста для выделения из него составных частей. На практике представляет собой выносящую мозг абракадабру, чуть менее чем полностью состоящую из знаков препинания, которая передается программе-парсеру регулярных выражений, и при применении этого шаблона к определенному тексту парсер вычленяет из него определенные блоки, чем доставляет программисту ПРОФИТ!!. Короче, сабж — это мем в программировании.

Я знаю регулярные выражения!

На неокрепший разум познание регекспов действует разрушительно — появляется непреодолимое желание совать регекспы везде, даже когда можно обойтись более простыми и читаемыми средствами.

Модули, обеспечивающие поддержку функций работы с регулярками, можно найти для любого высокоуровнего неэзотерического языка, поэтому — краткий список языков, в которых НЕЛЬЗЯ использовать регекспы: Brainfuck, ассемблер.

Содержание

[править] Применение Регэкспов

Стандартом де-факто для регулярных выражений является PCRE — Perl Compatible Regular Expression. Регулярки данного стандарта понимают фактически все современные языки программирования. Существуют также и другие стандарты, например винрарный POSIX, однако широкого распространения они не получили и используются преимущеcтвенно PHP-быдлокодерами[1] или трухардкор-красноглазиками

Пример, который соответствует большинству корректных адресов E-mail, например FuckMyBrain@pechenki.com:

^[-.\w]+@(?:[a-z\d][-a-z\d]+\.)+[a-z]{2,6}$

Того же результата и даже более омниприменимого результата можно добиться и другими, более сложными регэкспами. Самый полный известный регексп, проверяющий корректность E-mail в соответствии с грамматикой RFC822 занимает более страницы машинописного текста. И таки он тоже неидеален.

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

Some people, when confronted with a problem, think "I know, I’ll use regular expressions." Now they have two problems.

Jamie Zawinski in comp.lang.emacs

Регулярки как правило применяются тремя способами:

  • Сопоставление (match) — смысл действия в том чтобы выяснить соответствует ли определенный текст заданному регулярному выражению. Например текст «Пыщь!!!!!11» не соответствует вышеприведенному регэкспу.
  • Поиск (find) — позволяет выдрать из текста все последовательности символов, соответствующие регулярке. Например при выполнении данной операции с вышеприведенной регуляркой к любой веб-странице на выходе прогер получит хуй, ибо сий регэксп начинается с ^ и кончается $, что означает что выражение соответствует не просто последовательности символов, а целой строке, или даже всему тексту. Если же убрать данные символы из концов выражения, то счастливый юзер получит все e-mail адреса, указанные на странице, что позволит ему люто, бешено рассылать спам.
  • Замена (replace) — позволяет не просто найти, но и уничтожить заменить определенные последовательности символов в строке, что позволяет например легко менять корни слов в тексте, делать всякие там фильтры мата или вчерную пиздить целые сайты, меняя на них ссылки на ходу.

В конечном счете бытовой программист с помощью регэкспов может делать, например, такие вещи:

  • Проверять правильность ввода пользователем данных в различных интерфейсах и делать прочие кошерные вещи.
  • Изменять поведение скриптов с юзерской стороны в зависимости от того, где находится (каков полный адрес страницы) юзер, что удобно на сайтах с изменяющимся контентом.
  • Автоматически обрабатывать выдачу различных поисковиков и сервисов типа Vkontakte, дабы собрать базу емылов/асечек и онанировать на нее
  • Поднять у себя на сервере зеркало любого сайта, рассчитывая заграбастать случайных посетителей.
  • Обрабатывать выдачу яндекса, чтобы пиздить контент и заполнять интернеты богомерзкими говносайтами, чуть более чем полностью состоящими из рекламы и приносящими своему создателю 2-3 доллара в день.
  • Обрабатывать спизженное, чтобы получить псевдоуникальный контент и тем самым чуть-чуть поднять свой бредосайт над своими менее удачливыми собратьями, обогатившись на доллар-два в день.
  • Грабить корованы
  •  ??????
  • PROFIT

[править] Пример

Вот такие пироги. Что школьнику не дай, а он всё в кривой фаллометр превращает.

[править] s///

Распространенной практикой является использование в письменной речи (а не только в исходниках программ) оператора замены s/// из sed (также есть в perl). Например, допустив опечатку можно написать следующим сообщением, скажем, s/монад/номад/g, означает «надо бы заменить „монад“ на „номад“». Еще так можно скорректировать предыдущего оратора в треде, подсказать ему другое направление мысли.

[править] Тетрис на sed

Умные девушки/55238 пишут тетрис на sed.

[править] Если бы не было программистов

Следует заметить, что регулярные выражения существуют не только в ОйТи, но и в сугубо матанских областях знаний, например в той же дискретной математике. Но там владение регэкспами приносит значительно меньше профита, и посему рассматриваться нами в рамках данной статьи не будет. Кому интересно — читайте педивикию по сабжу.

[править] См. также

[править] Примечания

  1. В виду того, что они не знают, что в PHP 5.3.0 признаны устаревшими (вызов кидает DEPRECATED) и окончательно исчезнут в PHP6


Источник — «http://lurkmore.ru/Regexp»