Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы на вопросы по МИРу.doc
Скачиваний:
3
Добавлен:
28.04.2019
Размер:
572.42 Кб
Скачать

11. Регулярные выражения, сопоставление и поиск с шаблоном.

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

Базовый синтаксис и создание регулярных выражений

Простейшее регулярное выражение можно записать так: "abc"

Это выражение соответствует любой строке, которая содержит подстроку "abc".

"[abc]"--Этому регулярному выражению соответствует любая строка, содержащая abc либо вместе, либо каждый из них в отдельности. Выражение в квадратных скобках иногда еще называют бракет выражением.

"[а-Я]"--Это выражение соответствует всем буквам русского алфавита, поскольку любые два символа, разделяемые дефисом, задают соответствие диапазону символов, находящихся между ними. Заметьте, что регулярное выражение "[а-Я]" описывает символы как нижнего, так и верхнего регистров, поэтому более подробно это выражение можно записать так: "[а-яА-Я]"

Точно таким же образом задаются регулярные выражения, соответствующие числам:

"[0-9]" или "[0123456789]"

Оба этих выражения эквивалентны и соответствует любой цифре.

Групповой символ

При создании регулярных выражений часто удобно пользоваться групповым символом точки ".", который объединяет два одиночных символа, за исключением символа \n. К примеру: .ок

Это выражение, в частности соответствует строкам "кок", "док", "ток".

Выражение "x.[0-9]"

соответствует строке, содержащей символ x, за которым идет любой другой символ и цифры от 0 до 9. Этому критерию, к примеру, удовлетворяют строки "xy1", "xz2"

Ветви

В регулярном выражении может быть несколько ветвей, которые разделяются символом |, действующим как оператор OR (ИЛИ). "abc|абв"

Исключающее выражение

Для исключения последовательности символов из поиска перед этой ней ставится символ "^": "[^а-я]"

Это регулярное выражение отвечает любому символу, не содержащемуся в диапазоне а-я.

Квалификаторы

Регулярное выражение можно уточнить при помощи квалификаторов - так называются символы +, ?, *. Квалификаторы говорят о том, сколько раз последовательность символов может встретиться в строке и указываются непосредственно после той части выражения, к которой они применяются:

"a+" - хотя бы один а (строки "абв" и "абва" соответствуют этому выражению, а строка "укр" - нет);

"a?" - ноль или один а (строки "абв" и "укр" соответствуют этому выражению, а строка "абва" - нет);

"a*" - ноль или более а (строки "абв" и "абва" и "укр" соответствуют этому выражению).

Границы

Границы - это числа в фигурных скобках, указывающие количество вхождений в строку фрагмента выражения, непосредственно предшествующего границе:

"xy{2}" соответствует строке, в которой за x следует два y;

"xy{2,}" соответствует строке, в которой за x следует не менее 2 y (может быть и больше);

"xy{2,6}" соответствует строке, в которой за x следует от 2 до 6 y;

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

"x(yz){2,6}" соответствует строке, в которой за x следует от 2 до 6 последовательностей yz;

"x(yz)*" соответствует строке, в которой за x следует ноль и более последовательностей yz;

Подвыражения

Иногда бывает удобно создавать регулярное выражение таким образом, чтобы можно было, к примеру, сказать, что, по крайней мере, за одной из строк "морская", следует точно строка "волна". Для этого регулярное выражение разбивают на подвыражения с помощью круглых скобок:

(морская)*волна

Это выражение соответствует строкам "волна", "морская волна", "морская морская волна" и т.д.

Соответствие началу и концу строки

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

Символ ^ соответствует началу строки: "^xy"

Такое выражение соответствует любой строке, начинающейся с xy.

Знак доллара $ соответствует концу строки: "xy$"

Это регулярное выражение соответствует любой строке, заканчивающейся на xy.

Сопоставление со специальными символами

В тех случаях, когда нужно сопоставить выражение строке, в которой встречаются спецсимволы такие, как $, ^, { и т. д., перед ними ставится символ обратной косой черты (\).

Функции для работы с регулярными выражениями

Ereg()

bool ereg(string pattern, string string [, array regs])

Данная функция ищет в строке string соответствие регулярному выражению, заданному в шаблоне pattern. Если соответствия подвыражений с шаблоном будут найдены, то они сохраняются в массиве соответствий regs. При этом $regs[0] содержит копию строки string, $regs[1] содержит подстроку, начинающуюся с первой левой скобки, $regs[2] хранит подстроку, начинающуюся со второй левой скобки и т.д.

Ниже приведен код, преобразующий дату из формата YYYY-MM-DD в формат DD.MM.YYYY.

ereg_replace()

string ereg_replace(string pattern, string replacement, string string)

Эта функция заменяет найденный в строке string шаблон pattern на строку replacement и, если соответствие было найдено, возвращает модифицированную строку.

split()

array split (string pattern, string string [, int limit])

Эта функция возвращает массив строк, которые представляют собой подстроки строки string, образованные в результате разделения строки string на подстроки в соответствии с регулярным выражением pattern. Если указан необязательный параметр limit, то в возвращаемом массиве будет не больше limit элементов, последний из которых содержит неразделенную часть строки.

Эта функция полезна при разделении дат, доменных имен и т.д.