Книга: JavaScript. Подробное руководство, 6-е издание
10.1.3.1. «Нежадное» повторение
10.1.3.1. «Нежадное» повторение
Символы повторения, перечисленные в табл. 10.3, соответствуют максимально возможному количеству повторений, при котором обеспечивается поиск последующих частей регулярного выражения. Мы говорим, что это - «жадное» повторение. Имеется также возможность реализовать повторение, выполняемое «нежадным» способом. Достаточно указать после символа (или символов) повторения вопросительный знак: ??, +?, *?
или даже {1,5}?
. Например, регулярное выражение /а+/
соответствует одному или более экземплярам буквы а
. Примененное к строке «ааа
», оно соответствует всем трем буквам. С другой стороны, выражение /а+?/
соответствует одному или более экземплярам буквы а
и выбирает наименее возможное число символов. Примененный к той же строке, этот шаблон соответствует только первой букве а
.
«Нежадное» повторение не всегда дает ожидаемый результат. Рассмотрим шаблон /а+b/
, соответствующий одному или более символам а
, за которыми следует символ Ь
. Применительно к строке «аааb
» ему соответствует вся строка. Теперь проверим «нежадную» версию /а+?b/
. Можно было бы подумать, что она должна соответствовать символу b, перед которым стоит только один символ а
. В случае применения к той же строке «аааЬ
» можно было бы ожидать, что она совпадет с единственным символом а
и последним символом b. Однако на самом деле этому шаблону соответствует вся строка, как и в случае «жадной» версии. Дело в том, что поиск по шаблону регулярного выражения выполняется путем нахождения первой позиции в строке, начиная с которой соответствие становится возможным. Так как соответствие возможно, начиная с первого символа строки, более короткие соответствия, начинающиеся с последующих символов, даже не рассматриваются.