Материал предоставлен https://it.rfei.ru

Чуть более длинный урок по регулярным выражениям

Как и большинство программ, которые вы запускаете на компьютере, регулярные выражения были разработаны, а не просто выпрыгнули из головы создателя. Одно дело — понимать, что означают символы, и совсем другое — уметь их читать или писать.

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

Поиск соответствия IP-адресов

В предыдущем разделе говорилось о метасимволах, которые соответствуют различным подмножествам символов. Самым гибким (универсальным), мощным и в то же время опасным символом является точка .. Точка будет соответствовать любому символу, за исключением маркера конца строки (\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/.+?

Краткий урок по регулярным выражениямПоиск соответствия для пары "имя переменной/значение"