Анимация
JavaScript
|
Главная Библионтека Примечание Ошибки такого рода чрезвычайно распространены, и можно не один час ломать голову, почему же все работает не так, как должно. Группы символов Было бы глупо, если бы RegEx позволял нам задавать части искомых строк только непосредственно, как это было рассмотрено выше. Поэтому существуют несколько спецсимволов, обозначающих сразу группу букв. Эта возможность - один из краеугольных камней, основ регулярных выражений. Самый важный из таких знаков - точка "." - обозначает один любой символ. Например, вхражение a.b имеет совпадение для строк azb или aqb, но не "срабатывает" для, скажем, aqwb или ab. Позже мы рассмотрим, как можно заставить точку обозначать ровно один (или, к примеру, ровно пять) любых символов. Но это далеко не все. Возможно, вы захотите искать не любой символ, а один из нескольких указанных. Для этого наши символы нужно заключить в квадратные скобки. К примеру, вхражение a[xXyY]c соответствует строкам, в которых есть подстро- Простые символы Класс простых символов, действительно, самый простой. А именно, любой символ в строке на RegEx обозначает сам себя, если он не является управляющим (к управляющим символам причисляются следующие: ".*?+[]{}$"). Например, регулярное вхражение abcd будет "реагировать" на строки, в которых встречается последовательность abcd. Отмена действия спецсимволов Если же нужно вставить в выражение один из управляющих символов, но только так, чтобы он "не действовал", достаточно предварить его обратным слэшем. К примеру, если мы ищем строку, содержащую подстроку a*b, то мы должны использовать для этого вхражение a\*b (опять же, в PHP эта строка будет записываться как "a\\*b"), поскольку символ * является управляющим (вскоре мы рассмотрим, как он работает). Здесь я хотел бы еще (на этот раз в последний) раз заострить внимание на одной детали. Как вы знаете, для того, чтобы в какую-то строку вставить слэш, необходимо его удвоить. То есть мы не можем написать $a="a\*b" но можем $a="a\\*b" В последнем случае в строке $a оказывается a\*b. Так как регулярные выражения в PHP представляются именно в виде строк, то необходимо постоянно помнить это правило. ки из трех символов, начинающиеся с а, затем одна из букв x, X, y, Y и, наконец, буква c. Если нужно вставить внутрь квадратных скобок символ [ или ] , то следует просто поставить перед ним обратный слэш (напоминаю, в строках PHP - два слэша), чтобы отменить его специальное действие. Если букв-альтернатив много, и они идут подряд, то не обязательно перечислять их все внутри квадратных скобок - достаточно указать первую из них, потом поставить дефис и затем - последнюю. Такие группы могут повторяться. Например, выражение [a-z] обозначает любую букву от a до z включительно, а вхражение [a-zA-z0-9 ] задает любой алфавитно-цифровой символ. Существует и другой, иногда более удобный способ задания больших групп символов. В языке RegEx в скобках [ и ] могут встречаться не только одиночные символы, но и специальные выражения. Эти выражения определяют сразу группу символов. Например, [:alnum:] задает любую букву или цифру, а [:digit:] - цифру. Вот полный список таких выражений: □ [:alpha:] - буква; □ [:digit:] - цифра; □ [:alnum:] - буква или цифра; □ [:space:] - пробельный символ; □ [:blank:] - пробельный символ или символы с кодом 0 и 255; □ [:cnrtl:] - управляющий символ; □ [:graph:] - символ псевдографики; □ [:lower:] - символ нижнего регистра; □ [:upper:] - символ верхнего регистра; □ [:print:] - печатаемый символ; □ [:punct:] - знак пунктуации; □ [:xdigit:] - цифра или буква от A до Z. Как видим, все эти вхражения задаются в одном и том же виде - [: что то:]. Хочу еще раз обратить ваше внимание на то, что они могут встречаться только внутри квадратных скобок. Например, допустимы такие регулярные выражения: abc[[:alnum:]]+ abc, затем одна или более буква или цифра abc[[:alpha:][:punct]0] abc, далее буква, знак пунктуации или 0 но совершенно недопустимы следующее: abc[:alnum:]+ не работает! Еще одно привлекательное свойство выражений [: что то:] заключается в том, что они автоматически учитывают настройки локали, а значит, правильно работают с "русскими" буквами (конечно, если перед этим была вызвана функция setlocale() с верными параметрами). Таким образом, выражение [[:alpha:]]+ удовлетворяет ( Замечание Язык PCRE, в отличие от RegEx, позволяет ограничивать "жадность" квантификаторов. Одно или более совпадений Возможно, вы заметили некоторую неуклюжесть в предыдущем примере. В самом деле, фактически мы составляли выражение, которое ищет строки с a и одним или более минусом. Можно было бы записать его и так: a--*, но лучше воспользоваться специальным квантификатором, который как раз и обозначает "одно или любому слову как на английском, так и на русском языке. Добиться этого при помощи "обычного" использования [... ] было бы очень тяжело. Отрицательные группы Иногда (когда альтернативных символов много) бывает довольно утомительно перечислять их всех в квадратных скобках. Особенно обидно выходит, если нас устраивает любой символ, кроме нескольких (например, кроме > и <). В этом случае, конечно, не стоит указывать 254 символа, вместо этого лучше воспользоваться конструкцией [<>], которая обозначает любой символ, кроме тех, которые перечислены после и до ]. Например, вхражение a[ \t\n\r]b "срабатывает" на все строки, содержащие буквы a и b, разделенные любым не пробельным символом. В отрицательной группе могут быть задействованы любые символы и выражения, которые допустимы в конструкции [... ] . Таким образом, мы можем положиться на настройки локали и в этом случае. Квантификаторы повторений Перейдем теперь к рассмотрению так называемых квантификаторов - специальных знаков, использующихся для уточнения действия предшествующих им символов первого класса. Ноль или более совпадений Наиболее важный из них - звездочка * . Она обозначает, что предыдущий символ может быть повторен ноль или более раз (то есть, возможно, и ни разу). Например, выражение a-*- соответствует строке, в которой есть буква a , затем - ноль или более минусов и, наконец, завершающий минус. В простейшем случае при этом делается попытка найти как можно более длинную строку, т. е. звездочка "поглощает" так много символов, как это возможно. К примеру, для строки a--- b найдется подстрока a--- (звездочка "заглотила" 2 минуса), а не a- (звездочка захватила 1 минус). Это - так называемая "жадность" квантификатора, и в PHP нет, к сожалению, возможности "убавить ему аппетит". 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 [ 99 ] 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 |