Как и большинство программ, которые вы запускаете на компьютере, регулярные выражения были разработаны, а не просто выпрыгнули из головы создателя. Одно дело — понимать, что означают символы, и совсем другое — уметь их читать или писать.
Далее будут разобраны примеры регулярных выражений для некоторых ситуаций, с которыми часто приходится сталкиваться веб-мастеру.
В предыдущем разделе говорилось о метасимволах, которые соответствуют различным подмножествам символов. Самым гибким (универсальным), мощным и в то же время опасным символом является точка .
. Точка будет соответствовать любому символу, за исключением маркера конца строки (\n
на языке регулярных выражений). В любом случае она будет соответствовать буквам, цифрам, знакам препинания, пробелам, символам табуляции и т.д. Она будет соответствовать даже точкам! Так как найти соответствие литеральной точке?
Чтобы в регулярном выражении превратить точку-метасимвол в литеральную точку, нужно экранировать ее, поместив перед ней символ обратной косой черты: \
.
Нужно найти соответствие определенному IP-адресу: 192.168.0.1
. Если написать следующее регулярное выражение:
192.168.0.1
Оно будет соответствовать 192x16830,1
а также 192.168.0.1
. Вместо этого нужно написать:
192\.168\.0\.1
Теперь парсер регулярных выражений знает, что вы имеете в виду: литеральные точки не “соответствуют любому символу”. А если вам нужно найти соответствие диапазону адресов? Например, нужно найти соответствие адресам от 192.168.0.1
до 192.168.0.5
. Это опять очень просто:
192\.168\.0\.[1-5]
Не забывайте, что экранирование действует на разнообразные метасимволы. Например, амперсанд (символ &
) — это метасимвол. Для его отключения всегда следует использовать запись \&
.
Некоторые метасимволы создаются путем экранирования букв: \n
означает конец строки, a \t
— табуляцию.
Чтобы обратиться к предыдущему соответствию, которое вы “сохранили”, поместив в круглые скобки, воспользуйтесь экранированием числа. Для обращения к первому соответствию используйте запись \1
, ко второму — \2
и т.д. Иногда приходится даже “экранировать экранирование” с помощью записи \\
, если нужно найти соответствие литеральной обратной косой черте.
Первое, что вам нужно сделать, создавая регулярное выражение, — это подумать, что должен представлять собой шаблон. Как он начинается и заканчивается? Есть ли символы, которые появляются время от времени? На языке программистов они называются “разделители” (delimiters). Если вы когда-либо открывали в текстовом редакторе csv-файл (созданный в Excel), то видели, что все значения разделены запятыми. Запятая — это разделитель.
А какой тип разделителя у структуры каталогов вашего веб-сайта? Ниже рассмотрен пример реального URL-адреса:
http://rfei.pro/ic/index.html
Косые черты отделяют протокол http:
от доменного имени rfei.pro
. Затем такие же косые черты разделяют имена каталогов.
Первое — имя каталога, для которого нужно найти соответствие:
ic
Второе, разделители — прямые косые черты перед именем каталога и после него:
/ic/
У сайта есть второе доменное имя, pro.rfei.ru
, которое указывает на сайт, так же как egroups.com
указывает на сайт groups.yahoo.com
. Нельзя вставить целый адрес http://rfei.pro/
в шаблон, потому что иногда это http://rfei.pro/ic/
, а иногда — http://pro.rfei.ru/ic/
.
Таким образом, точно неизвестно, что идет перед нужным каталогом. В каталоге ic
также есть подкаталоги и страницы. Так что надо как-то выразить следующую мысль: есть “что-то” перед и “что-то” после имени каталога ic
.
”Что-то” — это технический термин. На языке регулярных выражений .+
означает “что-то”. Следует использовать .+
вместо .*
, потому что .*
может соответствовать самому слову “ic”, а нужно убедиться, что есть “что-то” до и после.
Получится следующее выражение:
.+/ic/.+
Обратите внимание на присутствие в выражении косых черт.
Если написать следующее регулярное выражение:
.+ic.+
,
то ему будет соответствовать, например, следующее:
http://rfei.pro/certificates
.
В конце концов, это вписывается в шаблон, потому что есть “что-то” до и после слова “ic”. Таким образом, без косых черт в качестве разделителей будет находиться соответствие с тем, что совсем не нужно.
А теперь нужно сделать так, чтобы эти .+
соответствия не были такими “жадными”. Слово “ic” использовалось только для имени данного каталога. Поэтому у регулярного выражения нет шансов запутаться в результатах, если оно окажется “жадным”. Но лучше перестраховаться. Как говорится, семь раз отмерь...
.+?/ic/.+?
Краткий урок по регулярным выражениям | Поиск соответствия для пары "имя переменной/значение" |