| |
рукцией
[^<>], которая обозначает любой символ, кроме тех, которые перечислены после [^
и до ]. Например, выражение a[^ \t\n\r]b "срабатывает" на все строки, содержа-
щие буквы a и b, разделенные любым не пробельным символом.
В отрицательной группе могут быть задействованы любые символы и выражения,
которые допустимы в конструкции [...]. Таким образом, мы можем положиться на
настройки локали и в этом случае.
Квантификаторы повторений
Перейдем теперь к рассмотрению так называемых квантификаторов — специаль-
ных знаков, использующихся для уточнения действия предшествующих им символов
первого класса.
Ноль или более совпадений
Наиболее важный из них — звездочка *. Она обозначает, что предыдущий символ
может быть повторен ноль или более раз (то есть, возможно, и ни разу). Например,
выражение a-*- соответствует строке, в которой есть буква a, затем — ноль или
бо-
лее минусов и, наконец, завершающий минус.
В простейшем случае при этом делается попытка найти как можно более длинную
строку, т. е. звездочка "поглощает" так много символов, как это возможно. К
приме-
ру, для строки a---b найдется подстрока a--- (звездочка "заглотила" 2 минуса),
а не
a- (звездочка захватила 1 минус). Это — так называемая "жадность" квантификато-
ра, и в PHP нет, к сожалению, возможности "убавить ему аппетит".
Язык PCRE, в отличие от RegEx, позволяет ограничивать "жадность" кванти-
фикаторов.
Одно или более совпадений
Возможно, вы заметили некоторую неуклюжесть в предыдущем примере.
В самом деле, фактически мы составляли выражение, которое ищет строки с a и од-
ним или более минусом. Можно было бы записать его и так: a--*, но лучше
восполь-
зоваться специальным квантификатором, который как раз и обозначает "одно или
Глава 22. Основы регулярных выражений в формате RegEx 303
более совпадений" — символом плюса +. С его помощью можно было бы выражение
записать лаконичнее: a-+, что буквально и читается как "a и один или более
мину-
сов". Вот пример выражения, которое определяет, есть ли в строке английское
слово,
написанное через дефис: [a-zA-Z]+-[a-zA-Z]+.
Ноль или одно совпадение
И уж чтобы совсем облегчить жизнь, иногда используют еще один квантификатор —
знак вопроса ?. Он обозначает, что предыдущий символ может быть повторен ноль
или один (но не более!) раз. Например, выражение
[a-zA_Z]+\r?\n определяет строки, в которых последнее слово прижато к правому
краю строки. Если мы работаем в Unix, то там в конце строки символ \r обычно
от-
сутствует, тогда как в текстовых файлах Windows каждая строка заканчивается
парой
\r\n. Для того чтобы сценарий правильно работал в обоих системах, мы должны
учесть эту особенность — возможное наличие \r перед концом строки.
Заданное число совпадений
Наконец, давайте рассмотрим последний квантификатор повторения. С его помощью
можно реализовать все перечисленные выше возможности, правда, и выглядит он
несколько более громоздко. Итак, сейчас речь пойдет о квантификаторе "фигурные
скобки". Существует несколько форматов его записи. Давайте последовательно раз-
берем каждый из них.
r X{n,m} — указывает, что символ X может быть повторен от n до m раз;
r X{n} — указывает, что символ X должен быть повторен ровно n раз;
r X{n,} — указывает, что символ X может быть повторен n или более раз.
Значения n и m в этих примерах обязательно должны принадлежать диапазону от 0
до
255 включительно. В качестве тренировки вы можете подумать, как будут выглядеть
квантификаторы *, + и ? в терминах {...}.
Мнимые символы
Мнимые символы — это просто участок строки между соседними символами (да,
именно так, как это ни абсурдно), удовлетворяющий некоторым свойствам. Фактиче-
ски, мнимый символ — это некая позиция в строке. Например, символ ^
соответству-
ет началу строки (заметьте: не первому символу строки, а в точности началу
строки,
позиции перед первым символом), а $ — ее концу (опять же, позиции за концом
стро-
ки).
Чтобы это понять, давайте рассмотрим выражение ^abc, которое соответствует лю-
бой строке, начинающейся с abc, и выражение abc$, соответствующее строке с abc
на "хвосте". Наконец, выражение ^abc$ сопоставимо только со строкой
|
|