Введение в регулярные выражения. Статьи. wb0.ru - Все для веб-мастера, on-line сервисы

Введение в регулярные выражения

Регулярные выражения часто воспринимаются как что-то непонятное, даже мистическое, которые понять может только "гуру" в программировании. Они трудночитаемы, непонятны на первый взгляд для человека не знакомого с их синтаксисом, выглядят как строки, состоящие из случайного набора символов. В действительности же - регулярные выражения довольно просты и понятны при использовании таблиц-подсказчиков.

Немного истории

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

С тех пор, регулярные выражения прошли через множество итераций, и текущий стандарт сохраняется ISO (Международной организацией по стандартизации) и определен Open Group, совместным усилием различных технических некоммерческих организаций.

Регулярные выражения не представляют из себя отдельный язык, - это определенный стандарт для поиска и замены текста в пределах файла или любой строки. Поддерживаются два стандарта: основные регулярные выражения (BRE - basic regular expressions) и расширенные регулярные выражения (ERE - extended regular expressions). ERE включает все функциональные возможности BRE, плюс дополнительные концепции.

Множество приложений используют регулярные выражения, включая xsh, egrep, sed, и vi, среди других на UNIX платформах, и они были приняты в той или иной форме большинством языков программирования. Также, как HTML и XML - оба являются производными от SGML, эти адаптации часто представляют собой производные от полного стандарта.

С перемещением регулярных выражений в кросс-платформенные языки программирования, их мощь использовалась множествами способов, неочевидными на первый взгляд. Поисковые серверы Internet используют их; почтовые программы также используют их для того, чтобы выяснить, что сообщения входят именно в ваш почтовый ящик. Даже если Вы - не UNIX программист, Вы можете использовать регулярные выражения, чтобы упростить ваши приложения, и сэкономить много времени при обходах массивов и манипулиции с переменными.

Синтаксис регулярных выражений

Синтаксис регулярных выражений многим должен показаться знакомыми, потому что Вы вероятно использовали их прежде, даже если не понимали, что это были регулярные выражения. Подстановочные знаки являются одним из типов RE операторов - конструкциями повторения. Давайте рассмотрим основные типы синтаксиса, которые составляют наиболее часто используемые части ERE стандарта. Для того, чтобы обеспечить качество примеров определенного использования, я использовал разнообразные приложения.

Соответствие символов

Трудность регулярных выражений состоит в том, что Вы хотите искать или чему это должно соответствовать. Без этой концепции, RE бесполезны. Каждое выражение будет содержать некоторую команду о том, что искать; см. Таблицу A.

Таблица A: Соответствие символов в регулярных выражениях
Оператор Описание Пример Результат
. Соответствует любому одному символу grep .ord sample.txt Будет соответствовать "ford", "lord", "2ord", и т.д. в файле sample.txt.
[ ] Соответствует любому одному символу, заключенному в квадратные скобки grep [cng]ord sample.txt Будет соответствовать только "cord", "nord" и "gord"
[^ ] Соответствует любому одному символу, не заключенному в квадратные скобки grep [^cn]ord sample.txt Будет соответствовать "lord", "2ord" и т.д., но не "cord" или "nord"
  Соответствует любой букве grep [a-zA-Z]ord sample.txt Будет соответствовать "aord", "bord", "Aord", "Bord" и т.д.
  Соответствует любой нецифре в промежутке 0-9 grep [^0-9]ord sample.txt Будет соответствовать "Aord", "aord" и т.д., но не "2ord" и т.д.
Операторы повторения

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

Таблица B: Операторы повторения в регулярных выражениях
Оператор Описание Пример Результат
? Соответствует определенному символу единожды, если тот существует egrep "?erd" sample.txt Будет соответствовать "berd", "herd", и т.д. и "erd"
* Соответствует определенному символу многократно, если тот существует egrep "n.*rd" sample.txt Будет соответствовать "nerd", "nrd", "neard" и т.д.
+ Соответствует определенному символу один или более раз egrep "[n]+erd" sample.txt Будет соответствовать "nerd", "nnerd" и т.д., но не "erd"
{n} Соответствует определенному символу точно n раз egrep "[a-z]{2}erd" sample.txt Будет соответствовать "cherd", "blerd" и т.д., но не "nerd", "erd", "buzzerd" и т.д.
{n,} Соответствует определенному символу минимум n раз egrep ".{2,}erd" sample.txt Будет соответствовать "cherd" и "buzzerd", но не "nerd"
{n,N} Соответствует определенному символу минимум n раз, но не более чем N раз egrep "n[e]{1,2}rd" sample.txt Будет соответствовать "nerd" и "neerd"
Якоря

Якоря описывают где соответствовать шаблону; см. Таблицу C. Они могут быть удобными, когда Вы ищете общие строковые комбинации. Для некоторых из этих примеров, я использовал комманду строчного редактора vi: s, которая обозначает замену. Основной синтаксис для этой команды - s/шаблон_поиска/шаблон_замены/.

Таблица C: Якоря регулярных выражений
Оператор Описание Пример Результат
^ Соответствует началу строки s/^/blah / Вставляет "blah" в начало строки
$ Соответствует концу строки s/$/ blah/ Вставляет "blah" в конец строки
\< Соответствует началу слова s/\</blah/ Вставляет "blah" в начало слова
    egrep "\<blah" sample.txt Соответствует "blahfield" и т.д.
\> Соответствует концу слова s/\>/blah/ Вставляет "blah" в конец слова
    egrep "\>blah" sample.txt Соответствует "soupblah" и т.д.
\b Соответствует началу или концу слова egrep "\bblah" sample.txt Соответствует "blahcake" и "countblah"
\B Соответствует середине слова egrep "\Bblah" sample.txt Соответствует "sublahper" и т.д.
Чередование

Другая удобная возможность в RE - чередование или вставка оператора. По существу, этот оператор эквивалентен логическому ИЛИ и представлен как символ |. Следующее выражение возвратит все вхождения слов и в файле sample.txt: egrep "(n|m) erd" sample.txt

Чередование может быть мощным инструментом когда Вы ищете определенные соответствия строк в файле, например: egrep "[nm] erd" sample.txt.

Реальная полезность чередований становится очевидной, когда Вы используете их вместе с некоторыми из более продвинутых особенностей RE.

Зарезервированные символы

Одна последняя важная концепция в использовании основных регулярных выражений - зарезервированные символы (также называемые специальными символами). Например, если Вы хотите поискать строки "ne*rd" и "ni*rd", соответствующее шаблону выражение "n[ei]*rd" будет соответствовать разновидностям "neeeeerd" и "nieieierd", но не строкам, которые Вы ищете. Поскольку '*' (звездочка) - специальный символ, Вы должны его экранировать, используя наклонную черту влево (\) в вашем шаблоне, так: "n [ei]\*rd". Другие специальные символы (названия на английском языке):

  • ^ - (carat)
  • . - (period)
  • [ - (left bracket}
  • $ - (dollar sign)
  • ( - (left parenthesis)
  • ) - (right parenthesis)
  • | - (pipe)
  • * - (asterisk)
  • + - (plus symbol)
  • ? - (question mark)
  • { - (left curly bracket, or left brace)
  • \ - backslash

Как только Вы начинаете включать эти символы в регулярные выражения, то уже не кажется удивительным их громоздкость - становится труднее их читать, чем писать. Рассмотрите этот частичный код, который вызывает фуцнкцию eregi в PHP, для проверки правильности адреса электронной почты:

eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$",$sendto)

Вот еще один пример. Заменяем глобальную переменную URI именем местного файла:

s/http:\/\/www\.domain\.com\/dir\/index\.html/\.\.\/dir\/index\.html/

Как Вы можете видеть, нелекго определить то, что точно происходит в этом регулярном выражении. Но если не экранировать специальные символы при помощи escape последовательности (\), значение нашего шаблона сильно изменится.

Заключение

Более полное описаниями по регулярным выражениям от Open Group здесь.


Дата публикации: 30.08.2008
Denveroid,
sitemaker.ru

   Ваш псевдоним:
Ваш комментарий:

Календарь событий


Новости Интернет


Поиск





Последний пересчет

тИЦ:07 Окт 15
PR:09 Дек 13

Наши партнеры

wservices.ru - регистрация доменов, Whois-сервисы Смайлы на все случаи жизни


 
Copyright © 2006-2024, wb0.ru