| |
В последнем случае в строке $a оказывается a\*b. Так как регулярные выражения в
PHP представляются именно в виде строк, то необходимо постоянно помнить это
правило.
Ошибки такого рода чрезвычайно распространены, и можно не один час ло-
мать голову, почему же все работает не так, как должно.
Группы символов
Было бы глупо, если бы RegEx позволял нам задавать части искомых строк только
непосредственно, как это было рассмотрено выше. Поэтому существуют несколько
спецсимволов, обозначающих сразу группу букв. Эта возможность — один из крае-
угольных камней, основ регулярных выражений. Самый важный из таких знаков —
точка "." — обозначает один любой символ. Например, выражение a.b имеет совпа-
дение для строк azb или aqb, но не "срабатывает" для, скажем, aqwb или ab.
Позже
мы рассмотрим, как можно заставить точку обозначать ровно один (или, к примеру,
ровно пять) любых символов.
Но это далеко не все. Возможно, вы захотите искать не любой символ, а один из
не-
скольких указанных. Для этого наши символы нужно заключить в квадратные скоб-
ки. К примеру, выражение a[xXyY]c соответствует строкам, в которых есть
подстро-
Глава 22. Основы регулярных выражений в формате RegEx 301
ки из трех символов, начинающиеся с а, затем одна из букв x, X, y, Y и, наконец,
бук-
ва c. Если нужно вставить внутрь квадратных скобок символ [ или ], то следует
про-
сто поставить перед ним обратный слэш (напоминаю, в строках PHP — два слэша),
чтобы отменить его специальное действие.
Если букв-альтернатив много, и они идут подряд, то не обязательно перечислять
их
все внутри квадратных скобок — достаточно указать первую из них, потом
поставить
дефис и затем — последнюю. Такие группы могут повторяться. Например, выраже-
ние [a-z] обозначает любую букву от a до z включительно, а выражение [a-zAZ0-
9_] задает любой алфавитно-цифровой символ.
Существует и другой, иногда более удобный способ задания больших групп симво-
лов. В языке RegEx в скобках [ и ] могут встречаться не только одиночные
символы,
но и специальные выражения. Эти выражения определяют сразу группу символов.
Например, [:alnum:] задает любую букву или цифру, а [:digit:] — цифру. Вот
полный список таких выражений:
r [:alpha:] — буква;
r [:digit:] — цифра;
r [:alnum:] — буква или цифра;
r [:space:] — пробельный символ;
r [:blank:] — пробельный символ или символы с кодом 0 и 255;
r [:cnrtl:] — управляющий символ;
r [:graph:] — символ псевдографики;
r [:lower:] — символ нижнего регистра;
r [:upper:] — символ верхнего регистра;
r [:print:] — печатаемый символ;
r [:punct:] — знак пунктуации;
r [:xdigit:] — цифра или буква от A до Z.
Как видим, все эти выражения задаются в одном и том же виде — [:что_то:]. Хочу
еще раз обратить ваше внимание на то, что они могут встречаться только внутри
квадратных скобок. Например, допустимы такие регулярные выражения:
abc[[:alnum:]]+ // abc, затем одна или более буква или цифра
abc[[:alpha:][:punct]0] // abc, далее буква, знак пунктуации или 0
но совершенно недопустимы следующее:
abc[:alnum:]+ // не работает!
Еще одно привлекательное свойство выражений [:что_то:] заключается в том, что
они автоматически учитывают настройки локали, а значит, правильно работают с
"русскими" буквами (конечно, если перед этим была вызвана функция setlocale()
с верными параметрами). Таким образом, выражение [[:alpha:]]+ удовлетворяет
Часть IV. Стандартные функции PHP 302
любому слову как на английском, так и на русском языке. Добиться этого при
помо-
щи "обычного" использования [...] было бы очень тяжело.
Отрицательные группы
Иногда (когда альтернативных символов много) бывает довольно утомительно пере-
числять их всех в квадратных скобках. Особенно обидно выходит, если нас
устраива-
ет любой символ, кроме нескольких (например, кроме > и <). В этом случае,
конечно,
не стоит указывать 254 символа, вместо этого лучше воспользоваться конс
|
|