10.1.3.1. «Нежадное» повторение
Символы повторения, перечисленные в табл. 10.3, соответствуют максимально возможному количеству повторений, при котором обеспечивается поиск последующих частей регулярного выражения. Мы говорим, что это - «жадное» повторение. Имеется также возможность реализовать повторение, выполняемое «нежадным» способом. Достаточно указать после символа (или символов) повторения вопросительный знак: ??, +?, *?
или даже {1,5}?
. Например, регулярное выражение /а+/
соответствует одному или более экземплярам буквы а
. Примененное к строке « ааа
», оно соответствует всем трем буквам. С другой стороны, выражение /а+?/
соответствует одному или более экземплярам буквы а
и выбирает наименее возможное число символов. Примененный к той же строке, этот шаблон соответствует только первой букве а
.
«Нежадное» повторение не всегда дает ожидаемый результат. Рассмотрим шаблон /а+b/
, соответствующий одному или более символам а
, за которыми следует символ Ь
. Применительно к строке « аааb
» ему соответствует вся строка. Теперь проверим «нежадную» версию /а+?b/
. Можно было бы подумать, что она должна соответствовать символу b
, перед которым стоит только один символ а
. В случае применения к той же строке « аааЬ
» можно было бы ожидать, что она совпадет с единственным символом а
и последним символом b
. Однако на самом деле этому шаблону соответствует вся строка, как и в случае «жадной» версии. Дело в том, что поиск по шаблону регулярного выражения выполняется путем нахождения первой позиции в строке, начиная с которой соответствие становится возможным. Так как соответствие возможно, начиная с первого символа строки, более короткие соответствия, начинающиеся с последующих символов, даже не рассматриваются.
10.1.4. Альтернативы, группировка и ссылки
Грамматика регулярных выражений включает специальные символы определения альтернатив, подвыражений группировки и ссылок на предыдущие подвыражения. Символ вертикальной черты |
служит для разделения альтернатив. Например, /ab|cd|ef/
соответствует либо строке « аЬ
», либо строке « cd
», либо строке « ef
», а шаблон /\d{3}|[a-z]{4}/
- либо трем цифрам, либо четырем строчным буквам.
Обратите внимание, что альтернативы обрабатываются слева направо до тех пор, пока не будет найдено соответствие. При обнаружении совпадения с левой альтернативой правая игнорируется, даже если можно добиться «лучшего» соответствия. Поэтому, когда к строке « аЬ
» применяется шаблон /а|аЬ/
, он будет соответствовать только первому символу.
Круглые скобки имеют в регулярных выражениях несколько значений. Одно из них - группировка отдельных элементов в одно подвыражение, так что элементы при использовании специальных символов |, *, +, ?
и других рассматриваются как одно целое. Например, шаблон /java(script)?/
соответствует слову «java», за которым следует необязательное слово «script», a /(ab|cd)+|ef)/
соответствует либо строке « ef
», либо одному или более повторений одной из строк « аЬ
» или « cd
».
Другим применением скобок в регулярных выражениях является определение подшаблонов внутри шаблона. Когда в целевой строке найдено совпадение с регулярным выражением, можно извлечь часть целевой строки, соответствующую любому конкретному подшаблону, заключенному в скобки. (Мы увидим, как получить эти подстроки, далее в этой главе.) Предположим, что требуется отыскать одну или более букв в нижнем регистре, за которыми следует одна или несколько цифр. Для этого можно воспользоваться шаблоном /[a-z]+\d+/.
Но предположим также, что нам нужны только цифры в конце каждого соответствия. Если поместить эту часть шаблона в круглые скобки (/[a-z]+(\d+)/)
, то можно будет извлечь цифры из любых найденных нами соответствий. Как это делается, будет описано ниже.
С этим связано еще одно применение подвыражений в скобках, позволяющее ссылаться на подвыражения из предыдущей части того же регулярного выражения. Это достигается путем указания одной или нескольких цифр после символа \
. Цифры ссылаются на позицию подвыражения в скобках внутри регулярного выражения. Например, \1
ссылается на первое подвыражение, а \3
- на третье. Обратите внимание, что подвыражения могут быть вложены одно в другое, поэтому при подсчете используется позиция левой скобки. Например, в следующем регулярном выражении ссылка на вложенное подвыражение ([Ss]cript)
будет выглядеть как \2
:
Читать дальше
Конец ознакомительного отрывка
Купить книгу