Использование
регулярных выражений
Как
и было обещано, сейчас мы познакомимся с регулярными выражениями. Чем же они
могут нам помочь?
Представим
себе такую ситуацию. Вам нужно найти в исходном HTML-коде страницы интернет-адрес,
причем любой. Как вы это сделаете? Правильно, введете в поле
Search For окна
поиска и замены (см. рис. 2.27) символы www. И найдете... кое-что. Но не все.
Ведь интернет-адреса совсем не обязательно начинаются на "www". Что
в этом случае искать? Точку? Но точек в тексте и так хватает, и далеко не всякая
из них является частью интернет-адреса.
В
этом случае нам на помощь придет регулярное выражение. Оно будет иметь следующий
вид:
"http://.+\..{2,3}"
Ну
и как оно вам? Больше похоже на бессмысленный набор символов, в котором с трудом
угадывается что-то знакомое. Признаться, автор и сам сначала с трудом в них
разбирался. Ему помогала вот такая табличка — см. табл. 2.1.
Таблица
2.1. Регулярное выражение поиска интернет-адресов
|
|
|
|
|
|
|
|
|
|
Первая
кавычка и начало интернет-адреса
|
|
|
|
Точка
обозначает любой символ
|
|
|
|
Плюс
обозначает, что предыдущий символ должен повториться минимум один
раз
|
|
|
|
Обычная
точка. Ее предваряет обратная косая черта, т. к. точка — служебный
символ
|
|
|
|
|
|
|
|
Предыдущий
символ должен повторяться от двух до трех раз
|
|
|
|
|
|
|
|
|
|
Вы
можете попробовать это регулярное выражение в действии. Только не забудьте выбрать
в раскрывающемся списке
Search For пункт
Source Code.
Как
видите, в регулярных выражениях используются специальные символы — литералы.
С их-то помощью и задаются условия поиска тех или иных символов. Если вы
хотите найти какой-либо символ, совпадающий с литералом, вы должны будете предварить
его обратной косой чертой. Например, чтобы найти точку, вы должны использовать
такую последовательность символов: "\."
С
помощью регулярных выражений вы можете выполнять поиск самых разных слов и словосочетаний.
Например, регулярное выражение совпадает со словами "multimedia" и
"hypermedia", но не совпадает со словом "media". Литерал
| задает поиск либо первой, либо второй подстроки (в нашем случае либо "multi",
либо "hyper"), а скобки здесь использованы для того, чтобы отделить
друг от друга две части выражения. Если бы мы их не поставили, получилось бы
выражение
"(multi
| hyper) media" "multi | hypermedia"
совпадающее
со словами "multi" и "hypermedia". А регулярное выражение
"/b.+@.+\.com"
ищет
адреса электронной почты на серверах, чей интернет-адрес оканчивается на "com".
Здесь вам все знакомо, за исключением литерала /b, обозначающего границу слова.
То есть точка задает поиск любого символа, а /b. — только символа, с которого
начинается слово (пробел или возврат каретки). А как насчет вот такого выражения:
Оно
ищет любой знак препинания, находящийся в конце текстового абзаца. В этом выражении
используется много новых символов, так что мы рассмотрим его подробно. По аналогии
с предыдущим регулярным выражением, расшифруем его с помощью табл. 2.2.
Таблица
2.2. Регулярное выражение поиска последнего знака препинания абзаца
|
|
|
|
|
|
|
|
|
|
Один
из возможных символов: точка, восклицательный и вопросительный знаки.
Заметьте, что вопросительный знак предварен обратной косой чертой,
т. к. иначе Dreamweaver воспринял бы его как литерал
Этот
литерал обозначает конец строки
|
|
|
|
|
|
Хорошо,
при поиске подстрок регулярные выражения очень нам помогают. Но помогут ли они
при замене?
Еще
как!
Предположим,
например, что нам необходимо найти все нужные адреса электронной почты и заменить
у них окончание "com" на "ш". Для поиска в этом случае мы
используем уже знакомое и работающее регулярное выражение:
"/b(.+@.+\.)com"
Постойте,
но зачем мы взяли часть его в скобки? Ведь скобки используются для группировки,
отделения части регулярного выражения от других частей. Здесь же ничего отделять
не нужно — все и так работает.
А
вот зачем.
Дело
в том, что Dreamweaver, кроме всего прочего, помещает подстроку, совпадающую
с заключенной в скобки частью регулярного выражения, в особую ячейку памяти,
откуда ее можно потом будет извлечь. Таких ячеек памяти всего девять, и обращаться
к их содержимому можно по номеру. В частности, извлечь содержимое первой ячейки
в нашем случае можно так:
"$1"
Тогда
заменить окончание почтового адреса можно с помощью такого регулярного выражения:
"$1ru"
Здесь
все совсем просто. Мы берем первую подстроку и добавляем к ней окончание "ru".
Наберите в окне документа несколько произвольных адресов электронной почты и
проверьте наши выражения. Они работают.
Напоследок
самое время привести полный список всех литералов регулярных выражений. Они
перечислены в табл. 2.3.
Таблица
2.3. Литералы регулярных выражений
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Предыдущий
символ должен встретиться ноль, один или больше раз
|
|
|
|
Предыдущий
символ должен встретиться один или больше раз
|
|
|
|
Предыдущий
символ должен встретиться ноль или один раз
|
|
|
|
Любой
символ за исключением символа новой строки
|
|
|
|
Должен
встретиться символ х или символ у
|
|
|
|
Предыдущий
символ должен встретиться точно n раз
|
|
|
|
Предыдущий
символ должен встретиться от п до m раз
|
|
|
|
Должен
встретиться один из символов, перечисленных в квадратных скобках.
Можно задавать диапазоны символов, например [a-d] заменяет [abed]
|
|
|
|
Должен
встретиться любой символ, кроме перечисленных в квадратных скобках.
Можно задавать диапазоны символов
|
|
|
|
Граница
слова (пробел или возврат каретки)
|
|
|
|
|
|
|
|
Любая
цифра. Эквивалентен [0-9]
|
|
|
|
|
|
|
|
|
|
|
|
Любой
символ, кроме цифры. Эквивалентен [^0-9]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Любой
пробельный символ (пробел, табуляция, прогон страницы или перевод
строки)
|
|
|
|
Любой
символ, кроме пробела
|
|
|
|
|
|
|
|
Любой
алфавитно-цифровой символ или подчеркивание. Эквивалентен
[a-zA-Z0-9_]
|
|
|
|
Любой
символ, кроме алфавитно-цифрового и подчеркивания. Эквивалентен [^а-zА-z0-9
]
|
|
|
|
|
|
Назад Содержание Вперед