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 :
Читать дальше
Конец ознакомительного отрывка
Купить книгу