Урок 1. Знакомство с регулярными выражениями
20.03.2018
Категория: Регулярные выражения
В этом уроке вы узнаете, что такое регулярные выражения и что они могут делать.
Назначение регулярных выражений
Регулярные выражения (regular expressions), или сокращенно regex — инструментальные средства, и подобно всем инструментальным средствам, регулярные выражения предназначены для решения очень конкретных проблем. Чтобы узнать, что такое регулярные выражения и что они делают, лучше всего познакомиться с проблемами, которые решаются с их помощью.
Рассмотрим следующие сценарии.
- Вы ищете файл, содержащий текст car (независимо от регистра), но не хотите указать местонахождение текста car — в середине, в начале или в конце слова (например, scar, carry и incarcerate).
- Вы динамически генерируете Web-страницу (используя сервер приложений) и должны отобразить текст, найденный в базе данных. Текст может содержать URL, и вы хотите, чтобы на сгенерированной странице URL можно было активизировать щелчком (так что вместо того, чтобы генерировать только текст, вы хотите сгенерировать правильный HTML-тег
<a href="...">...</a>
. - Вы создаете Web-страницу, содержащую форму. Форма запрашивает у пользователя разную информацию, включая и адрес электронной почты. Вы должны проверить, что указанные адреса имеют правильный формат (т.е. что они являются синтаксически правильными (допустимыми)).
- Вы редактируете исходный текст и должны заменить все вхождения слова size на iSize, но замену хотите выполнять только для слова size и не хотите заменять вхождения size там, где они выступают как часть другого слова.
- Вы отображаете список всех файлов в файловой системе компьютера и хотите отфильтровать этот список так, чтобы определить местонахождение только тех файлов, которые содержат текст Application.
- Вы импортируете данные в приложение. Данные разграничены знаками табуляции, и ваше приложение поддерживает файлы формата CSV (одна строка данных в строке текста, значения разделены запятыми, каждое значение можно заключить в кавычки).
- Вы должны найти в файле определенный текст, но только в определенном местоположении (например, в начале строки или в конце предложения).
Все эти сценарии представляют собой обычные программистские задачи. И все они могут быть решены почти на любом языке, в котором есть условные выражения и операции над строками. Но насколько сложно решить эти задачи? Вам понадобится в цикле перебирать слова или символы по одному, выполнять все типы условных операторов, отслеживать массу флажков, чтобы убедиться, что вы нашли то, что искали, или чтобы быть уверенными, что вы не нашли искомый текст, проверять всевозможные пробельные и специальные символы, и по ходу дела решить еще много подобных задач. И вы должны были бы сделать это все вручную.
Но вы можете использовать регулярные выражения. Каждая из предыдущих задач может быть решена с помощью подходящих инструкций, записанных в кратких строках, содержащих текст и специальные инструкции-команды, которые могут выглядеть следующим образом:
\b[Сс][Aa][Rr]\b
Как используются регулярные выражения
Просмотрите сценарии еще раз и обратите внимание, что все они относятся к одному из двух типов: либо отыскивается местонахождение информации (поиск текста), либо информация найдена и редактируется (выполняются замены). Фактически это и есть то, для чего используются регулярные выражения: поиск и замена. Каждое регулярное выражение либо ищет текст (выполняет операцию поиска) или ищет и заменяет текст (выполняет операцию замены).
Поиск с помощью регулярных выражений
Регулярные выражения используются для поиска тек¬ста, причем разыскиваемый текст может иметь разный вид, как при поиске саг в описанном ранее сценарии. Для начинающих отмечу, что задача может состоять в том, чтобы найти car
или CAR
или CaR
; это совсем простая часть (многие средства поиска способны выполнять поиск независимо от регистра). Более сложная часть состоит в том, чтобы гарантировать, что найденное вхождение car
не входит в scar
, carry
или incarcerate
. Некоторые более сложные редакторы имеют опции Match Only Whole Word
(Найти только слово целиком), но во многих эта опция отсутствует, и вы не можете делать такие замены в редактируемом документе. Решает проблему поиска использование регулярного выражения, а не просто текста car
.
\b[Cc][Aa][Rr]\b
.
Стоит заметить, что проверка на равенство (т.е. решение задачи вроде: соответствует ли указанный пользователем адрес электронной почты данному регулярному выражению?) и есть операция поиска. Выполняется операция поиска во всей введенной пользователем строке (а не операция поиска подстроки).
Замены с помощью регулярных выражений
Поиск с помощью регулярных выражений — очень мощное и очень полезное средство, причем совсем не трудно научиться применять его. Поэтому во многих уроках приводятся примеры выполнения операций поиска. Однако реальная польза регулярных выражений состоит именно в операциях замены, типа тех, что встречались в более раннем сценарии, в котором текстовый URL заменялся настоящим URL, активизирующимся щелчком мыши. Для начинающих отмечу, что для этого требуется определить местонахождение URL в тексте (возможно, для этого нужно выполнить поиск строк, которые начинаются с http://
или https://
и заканчиваются точкой, запятой или пробельным символом). Затем потребуется заменить найденный URL с двумя вхождениями найденной строки встроенным HTML-кодом так, чтобы
http://www.forta.com/
заменить на
<a href="http://www.forta.com/">http://www.forta.com/</a>
Опция Search and Replace
(Найти и заменить) в большинстве приложений не может выполнять операции замены такого типа, но решение этой задачи — невероятно простое регулярное выражение.
Так что же такое регулярное выражение?
Теперь, когда вы знаете, для чего используются регулярные выражения, дадим их определение. Попросту говоря, регулярные выражения — это строки, которые используются для поиска и обработки текста. Регулярные выражения записываются на языке регулярных выражений, т.е. на специализированном языке, разработанном и предназначенном для решения задач: поиска и замены текста. Подобно любому языку, язык регулярных выражений имеет специальный синтаксис и команды, которые вам предстоит освоить, и именно их вы будете изучать по данной книге.
Язык регулярных выражений — не полноценный язык программирования. Это обычно даже не программа или утилита, которую можно установить и использовать. Чаще всего регулярные выражения представляют собой миния-зыки, которые встроены в другие языки или программы. Хорошая новость состоит в том, что практически любой современный приличный язык или инструмент поддерживает регулярные выражения. Плохая новость в том, что сам по себе язык регулярных выражений не собирается искать что-нибудь подобно другим применяемым вами языкам или инструментам. Язык регулярных выражений — язык в себе, а совсем не интуитивно понятный язык для выполнения каких-либо очевидных операций.
grep
. Много лет регулярные выражения (в предварительно подготовленных сценариях) использовались исключительно в семействе Unix, однако теперь регулярные выражения поддерживаются в самых разных формах почти на каждой вычислительной платформе.
Приведем примеры правильных (допустимых) регулярных выражений (их смысл вы вскоре поймете):
Ben
.
www\.forta\.com
[a-zA-Z0-9_.]*
\r\n\r\n
\d{3,3}-\d{3,3}-\d{4,4}
Важно уяснить, что синтаксис — самая простая часть в освоении регулярных выражений. Что действительно трудно, так это научиться применять этот синтаксис и разбивать задачи на подзадачи, решения которых находятся с помощью регулярных выражений. Этому нельзя научиться, просто читая книгу; подобно любому языку, вы овладеете языком регулярных выражений, выполняя разнообразные упражнения, а мастерство придет с практикой.
Использование регулярных выражений
Как уже отмечалось, для регулярных выражений нет никакой особой программы; это не приложение, которое вы выполняете, и не программное обеспечение, которое вы можете купить или загрузить. Совсем наоборот, язык регулярных выражений реализован в большом количестве программных изделий, языков, утилит и сред разработки.
То, как используются регулярные выражения и какие функциональные возможности регулярных выражений экспортируются, зависит от используемого вами приложения. Иногда в приложениях для применения регулярных выражений используются меню и диалоговые окна, а в некоторых языках программирования имеются функции или классы объектов, которые экспортируют функциональные возможности регулярных выражений.
Кроме того, не все реализации регулярных выражений одинаковы. Часто есть очень тонкие (а иногда и не очень тонкие) различия в синтаксисе и возможностях регулярных выражений.
Чтобы вам было легче освоить материал, вы можете загрузить приложение Regular Expression Tester (испытатель регулярных выражений) с Web-страницы этой книги (http://www.forta.com/books/0672325667/). Данное приложение имеет версии для использования в популярных серверах приложений и языках, а также прямо в JavaScript.
Перед началом
Прежде чем приступить к применению регулярных выражений, примите во внимание следующее.
- При использовании регулярных выражений почти всегда есть несколько решений любой задачи. Некоторые решения более просты, некоторые более быстрые, некоторые более удобны для переноса, а некоторые более удобны для обобщения. Редко есть один единственно правильный способ записи регулярного выражения (подразумевается, конечно, что при всех формах записи поставленная задача решается правильно).
- Как уже указывалось, существуют различия в реализации регулярных выражений. Насколько возможно, примеры и информация в уроках этой книги применимы ко всем главным реализациям, причем различия и несовместимости отмечаются особо.
- Как и для любого языка, ключ к освоению регулярных выражений — практика, практика и еще раз практика.
Резюме
Регулярные выражения — одно из самых мощных инструментальных средств обработки текстов. Язык регулярных выражений применяется для записи регулярных выражений (фактически, записанную строку и называют регулярным выражением), причем регулярные выражения используются для выполнения операций замены и поиска.