Регулярное выражение (regular expression, regexp, регэксп) - механизм, позволяющий задать шаблон для строки и осуществить поиск данных, соответствующих этому шаблону в заданном тексте. Кроме того, дополнительные функции по работе с regexp'ами позволяют получить найденные данные в виде массива строк, произвести замену в тексте по шаблону, разбиение строки по шаблону и т.п. Однако главной их функцией, на которой основаны все остальные, является именно функция поиска в тексте данных, соответствующих шаблону, описанному в синтаксисе регулярных выражений.
Очень часто регулярные выражения используются для того, чтобы проверить, является ли данная строка строкой в необходимом формате. Например следующий regexp предназначен для проверки того, что строка содержит корректный e-mail адрес:
/^w+([.w]+)*w@w((.w)*w+)*.w{2,3}$/
Выглядит, на первый взгляд, довольно страшно :-) Но, тем не менее, это работает, и работает очень хорошо. А когда вы научитесь писать и использовать regexp'ы в своем коде - это еще будет и сильно облегчать вам жизнь.
Регулярные выражения пришли к нам из Unix и Perl. В PHP существует два различных механизма для обработки регулярных выражений: POSIX-совместимые и Perl-совместимые. Их синтаксис во многом похож, однако Perl-совместимые регулярные выражения более мощные и, к тому же, работают намного быстрее (в некоторых случаях до 10 раз быстрее). Поэтому здесь мы будем вести речь только о Perl-совместимых регулярных выражениях.
Кстати, необходимо заметить, что полное описание синтаксиса регулярных выражений, имеющееся в PHP Manual, занимает более 50 килобайт и, естественно, здесь мы не будем рассматривать весь синтаксис. Нам необходимы только основы, которые помогут вам понять, как именно пишутся регулярные выражения.
Сутью механизма регулярных выражений является то, что они позволяют задать шаблон для нечеткого поиска по тексту. Например, если перед вами стоит задача найти в тексте определенное слово, то с этой задачай хорошо справляются и обычные функции работы со строками.
Однако если вам нужно найти "то, не знаю что", о чем вы можете сказать только то, как приблизительно это должно выглядеть - то здесь без регулярных выражений просто не обойтись.
Например, вам необходимо найти в тексте информацию, про которую вам известно только то, что это "3 или 4 цифры после которых через пробел идет 5 заглавных латинских букв", то вы сможете сделать это очень просто, возпользовавшись следующим регулярным выражением:
/d{3,4}s[A-Z]{5}/
Синтаксис регулярных выражений
Регулярные выражения, как уже было сказано выше, представляют собой строку. Строка всегда начинается с символа разделителя, за которым следует непосредственно регулярное выражение, затем еще один символ разделителя и потом необязятельный список модификаторов.
В качестве символа разделителя обычно используется слэш ('/'). Таким образом в следующем регулярном выражении: /d{3}-d{2}/m, символ '/' является разделителем, строка 'd{3}-d{2}' - непосредственно регулярным выражением, а символ 'm', расположенный после второго разделителя - это модификатор.
Основой синтаксиса регулярных выражений является тот факт, что некоторые символы, встречающиеся в строке рассматриваются не как обычные символы, а как имеющие специальное значение (т.н. метасимволы).
Именно это решение позволяет работать всему механизму регулярных выражений. Каждый метасимвол имеет свою собственную роль в синтаксисе регулярных выражений. Далее мы рассмотрим все эти метасимволы.
Одним из самых важных метасимволов является символ обратного слэша (''). Если в строке встречается этот символ, то парсер рассматривает символ, непосредственно следующий за ним двояко:
- если следующий символ в обычном режиме имеет какое-либо специальное значение, то он теряет это свое специальное значение и рассматривается как обычный символ.
Это совершенно необходимо для того, чтобы иметь возможность вставлять в строку специальные символы, как обычные. Например метасимвол '.', в обычном режиме означает "любой единичный символ", а '.' означает просто точку. Также можно лишить специального значения и сам этот символ: '\'.
- если следующий символ в обычном режиме не имеет никакого специального значения, то он может получить такое значение, будучи соединенным с символом ''. К примеру символ 'd' в обычном режиме воспринимается просто как буква, однако, будучи соединенной с обратным слэшем ('d') становится метасимволом, означающим "любая цифра".
Существует множество символов, которые образуют метасимволы в паре с обратным слэшем. Как правило подобные пары используются для того, чтобы показать, что на этом месте в строке должен находиться символ, с кодом, который не имеет соответствующего ему изображения или же символ, принадлежащий какой-то определенной группе символов. Ниже приведены некоторые наиболее употребительные:
n - символ перевода строки (код 0x0A)
r - символ возврата каретки (код 0x0D)
t - символ табуляции (код 0x09)
xhh - вставка символа с шестнадцатиричным кодом 0xhh, например x41 вставит латинскую букву 'A'
d - цифра (0-9)
D - не цифра (любой символ кроме символов 0-9)
s - пустой символ (обычно пробел и символ табуляции)
S - непустой символ (все, кроме символов, определяемых метасимволом s)
w - "словесный" символ (символ, который используется в словах. Обычно все буквы, все цифры и знак подчеркивания ('_'))
W - все, кроме символов, определяемых метасимволом w
Примеры
/ddd/
Любое трехзначное число ('123', '719', '001')
/wsdd/
Буква, пробел (или табуляция) и двузначное число ('A 01', 'z 45', 'S 18')
/d and d/
Любая из следующих строк: '1 and 2', '9 and 5', '3 and 4'.
Синтаксис регулярных выражений имеет средства для определения собственных подмножеств символов. Например вам может понадобиться задать условие, что в этом месте строки должна находиться шестнадцатиричная цифра или еще что-то подобное.
Для описания таких подмножеств применяются символы квадратных скобок '[]'. Квадратные скобки, встреченные внутри регулярного выражения считаются одним символом, который может принимать значения, перечисленные внутри этих скобок.
Есть небольшая тонкость в том, как работают метасимволы внутри квадратных скобок. Дело в том, что в синтаксисе регулярных выражений существует еще множество метасимволов, но практически все они работают только вне секций описаний подмножеств. Единственные метасимволы, которые работают внутри этих секций это:
Обратный слэш (''). Т.е. все метасимволы из приведенной ранее таблицы будут работать.
Минус ('-'). Используется для задания набора символов из одного промежутка (например все цифры могут быть заданы как '0-9')
Символ '^'. Если этот символ стоит первым в секции задания подмножества символов (и только в этом случае!) он будет рассматриваться как символ отрицания. Т.о. можно задать все сиволы, которые не описаны в данной секции.
Несколько примеров, чтобы было понятно, как это работает:
[0-9A-Fa-f]
Цифра в шестнадцатиричной системе счисления
[dA-Fa-f]
То же самое, но с использованием метасимвола
[02468]
Четная цифра
[^d]
Все, кроме цифр (аналог метасимвола D)
[a^b]
Любой из символов 'a', 'b', '^'. Заметьте, что здесь символ '^' не имеет какого-либо специального значения, потому что стоит не на первой позиции внутри квадратных скобок.
Модификаторы регулярных выражений
Как уже было сказано ранее - механизм регулярных выражений позволяет добавлять модификаторы, влияющие на обработку регулярного выражения.
i - включение режима case-insensitive, т.е. большие и маленькие буквы в выражении не различаются.
m - указывает на то, что текст, по которому ведется поиск, должен рассматриваться как состоящий из нескольких строк. По умолчанию механизм регулярных выражений рассматривает текст как одну строку вне зависимости от того, чем она является на самом деле. Соответственно метасимволы '^' и '$' указывают на начало и конец всего текста. Если же этот модификатор указан, то они будут указывать соответственно на начало и конец каждой строки текста.
s - по умолчанию метасимвол '.' не включает в свое определение символ перевода строки. Т.е. для многострочного текста выражение /.+/ вернет только первую строку, а не весь текст, как ожидается. Указание этого модификатора снимает это ограничение.
U - делает все количественные метасимволы "не жадными" по умолчанию (про "жадность" количественных метасимволов см. выше)
Постоянные ссылки
При копировании ссылка на TeaM RSN обязательна!
Оставить комментарий
Вы должны войти, чтобы оставить комментарий.