Регулярные выражения — что это? Все о них слышали, но почти никто, кроме разработчиков, не использует. А между тем, это мощнейшее средство для поиска и осуществления манипуляций в тексте. Любая «регулярка» (или «регесп») представляет собой шаблон-образец для поиска, составленный по особым правилам. По какой-то нелепой и непонятной мне причине многие думают, что регулярные выражения, во-первых, очень сложны, а во-вторых, нужны только программистам. И то и другое — чушь.
С непривычки действительно довольно сложно въехать в принцип составления регулярок. Нужно думать, привыкать к синтаксису, подсматривать в шпаргалки с метасимволами и внимательно изучать примеры. К счастью, сейчас есть целый набор инструментов, которые кардинальным образом упрощают как изучение регулярных выражений, так и их дальнейшее использование.
Тем более, широко доступны базы готовых регулярок для решения наиболее типичных задач, так что во многих случаях можно вообще ничего не составлять вручную и при этом использовать очевидные преимущества технологии.
Также довольно глупо полагать, что регулярными выражениями могут воспользоваться только лишь программисты. Если вспомнить историю, то впервые поддержка регеспов появилась вовсе не в языках программирования, а в юниксовых программах: редакторе sed и фильтре grep. Сейчас же все большее количество приложений начинает поддерживать регулярные выражения для эффективного выполнения самых обычных задач: файловые менеджеры, текстовые редакторы и многие другие.
Можно по-прежнему использовать стандартный поиск с заменой для внесения правки в тексте, а можно приспособить регулярки для автоматического выполнения самых сложных замен. И это лишь примитивный пример.
В рамках этой колонки я ни в коем случае не хочу рассказывать о том, как составляются регулярки. Базовые знания, которых вполне достаточно для старта, можно получить, просто прочитав соответствующую статью в русской Wikipedia. Зато я точно знаю, как сделать процесс освоения, тестирования и использования регулярок проще, чем и спешу поделиться.
Чтобы лучше осознать, что регулярное выражение, как бы сложно оно ни выглядело, представляет собой лишь шаблон для поиска, нужно представить его в понятном графическом виде. Сервис strfriend (strfriend.com) позволяет для любой регулярки получить визуальное представление того, как она будет обрабатываться. Это сразу добавляет десять очков к пониманию.
Просто попробуй вставить несколько регеспов из учебника или откуда-либо еще и посмотреть граф их обработки — все тут же станет намного яснее. Регулярное выражение для проверки правильности e-mail — ^([^@s]+)@((?:[-a-z0-9]+.)+[a-z]{2,})$ — может показаться чудовищным для новичка. Но все встает на свои места, когда видишь его графическое представление.
К тому же, это еще и отличное средство для того, чтобы быстрее разобраться в чужом (или своем, но давно составленном) регулярном выражении, что полезно даже тем, кто с регулярками проблем не испытывает.
Аналогичный функционал предлагает разработка Graphrex (crotonresearch.com/graphrex), реализованная в виде плагина для среды разработки Eclipse. Если ввести это же регулярное выражение в программе RegexBuddy (regexbuddy.com), то получишь не менее ценную помощь. Для каждого токена (значимого элемента) регулярного выражения программа выдаст расшифровку: зачем он нужен и что в данном случае делает. Но главное то, что возможна и обратная конвертация. Как это выглядит?
Через удобное меню ты выбираешь нужные тебе токены с понятным описанием — скажем, «позиция в начале строки», «последовательность из не менее 2-х и не более 4-х символов», «символы от A до Z и цифры от 0 до 9», — а RegexBuddy сам составляет регулярное выражение: «A[A-Z0-9]{2,4}».
Синтаксис сильно отличается в разных языках программирования, но программа поддерживает почти все вариации (Perl, C#, PHP, Python, Java, JavaScript и другие).
Полученную регулярку тут же можно протестировать на произвольном тексте или сохранить для будущего использования в базе данных, в которой изначально собрано множество готовых примеров.
Аналогичные возможности предоставляют и другие утилиты, в том числе Expresso (ultrapico.com) и The regulator (sourceforge.net/projects/regulator). В отличие от RegexBuddy они бесплатны, но и не настолько удобны.
Напоследок хочу рассказать еще об одном любопытном методе, позволяющем каждому составлять регулярные выражения и при этом вообще не вникать в их синтаксис.
Идея в том, чтобы предоставить программе текст и отметить в нем те фрагменты, которые должна находить регулярка. Приложение при этом само пытается выполнить сопоставление и составить примерное регулярное выражение. Такой подход реализован в утилите RegexMagiс (regexmagic.com). Она, конечно, не сможет сделать абсолютно все за тебя — различные параметры регеспа непременно придется уточнять и подстраивать, но процесс работы выстроен таким образом, что работать с синтаксисом регулярных выражений не нужно вовсе.
Несколько демонстраций с практическими примерами на официальном сайте — наглядное тому подтверждение.