SiteMaker - Академия сайтостроительства | Разработка сайта
| Вёрстка сайта
| Веб программирование
| Интернет технологии
| Продвижение ресурса
| Инструментарий
карта сервера :: форум :: профайл :: авторам :: о сайте
Гид: SiteMaker.Ru » Веб программирование » PHP » Введение в регулярные выражения

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


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

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

Математик Стивен Клин впервые представил регулярные выражения в 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 – чередование или вставка оператора. По существу, этот оператор эквивалентен логическому ИЛИ и представлен как символ |. Следующее выражение возвратит все вхождения слов «nerd» и «merd» в файле 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 последовательности (\), значение нашего шаблона сильно изменится.

Заключение

В этой статье я попытался развеять мифы о регулярных выражениях и предложил полезные таблицы более используемуего синтаксиса стандарта ERE. Если Вы интересуетесь более полными описаниями по регулярным выражениям от самой Open Group, вы можете прочитать их спецификации онлайн.


Автор: DenveroidДата публикации: 09.07.2002
Рейтинг статьи: [3.47] рейтинг статьи: 3.47рейтинг статьи: 3.47рейтинг статьи: 3.47 [голосов: 15]Кол-во просмотров: 23264
Оценить статью: Установите cookies!

Комментарии читателей:


Сообщение №131 n3rf 22.01.2003 18:32:05
Просто супер!!!
Я рад за Дена проект развивается ...
Сообщение №179 ZzZ 28.03.2003 10:59:50
Ничего непонятно :(
Сообщение №183 trend 31.03.2003 14:55:25
Очень мало примеров...
Сообщение №195 vic 24.04.2003 11:23:55
Не работает следующая строка:
grep -E "s/$/ blah/"
почему?
Сообщение №230 Xenomorphhttp://bsx.ru/bb в новом окне21.05.2003 14:26:13
2 vic
насколько я понимаю - s - это комманда vi и тут она только для примера дана %))) а греп и виай предназначены для разных целей и соответственно комманды у них разные %)

» Читать все комментарии...

Ваши комментарии:

Ваше имя:*
Ваш E-mail:
Ваш URL:
HTML запрещен
BB Код разрешен


Ваше сообщение:*
* - обязательные поля для заполнения

Внимание!
Перед появлением сообщения на сайте, оно пройдет премодерацию.

Поиск по сайту:

Последние статьи:
Работа с WDDX в РНР Работа с WDDX в РНР
Транслитерация и детранслитерация на РНР Транслитерация и детранслитерация на РНР
Ночные мытарства спеца по раскрутке, или постраничный вывод контента в браузер на примере PHP Ночные мытарства спеца по раскрутке, или постраничный вывод контента в браузер на примере PHP
Создаем PHP отладчик своими руками. Часть 2 Создаем PHP отладчик своими руками. Часть 2
Создаем PHP отладчик своими руками. Часть 1 Создаем PHP отладчик своими руками. Часть 1
» архив всех статей
Схожая тематика:
:: Perl/CGI
:: ASP
:: JavaScript и VBScript

Академия веб мастеринга и веб дизайна. Разработка сайта, вёрстка сайта, веб программирование, продвижение ресурса, инструментарий и другие темы, посвященные разработке ресурсов в сети Интернет. Форум для веб мастера.


карта сервера :: форум :: профайл :: авторам :: о сайтеНаверх
Rambler's Top100Rambler's Top100 Valid HTML 4.01! © 2000-2016 Все права защищены
страница создана за 0.016 секунд
На главную страницуDeveloped by SiteMaker