Символы повторения, перечисленные в табл. 11.3, соответствуют максимально возможному количеству повторений, при котором обеспечивается поиск после_ дующих частей регулярного выражения. Мы говорим, что это – «жадное» повто_ рение. Помимо него в JavaScript 1.5 и более поздних версиях (это одна из воз_ можностей Perl 5, не реализованная в JavaScript 1.2) поддерживается повторе_ ние, выполняемое «нежадным» способом. Достаточно указать после символа (или символов) повторения вопросительный знак: ??, +?, *? или даже {1,5}?. На_ пример, регулярное выражение /a+/ соответствует одному или более экземпля_ рам буквы a. Примененное к строке "aaa", оно соответствует всем трем буквам. При этом выражение /a+?/ соответствует одному или более экземплярам буквы a и выбирает наименее возможное число символов. Примененный к той же строке, этот шаблон соответствует только первой букве a.
«Нежадное» повторение не всегда дает ожидаемый результат. Рассмотрим шаб_ лон /a*b/, соответствующий нулю или более символов a, за которыми следует сим_ вол b. Применительно к строке "aaab", ему соответствует вся строка. Теперь про_ верим «нежадную» версию /a*?b/. Она должна соответствовать символу b, перед которым следует наименьшее возможное количество букв a. В случае применения к той же строке "aaab" можно ожидать соответствия лишь последнего символа b. Однако на самом деле этому шаблону соответствует и вся строка, так же как и в случае «жадной» версии. Дело в том, что поиск по шаблону регулярного выра_ жения выполняется путем нахождения первой позиции в строке, начиная с кото_ рой соответствие становится возможным. «Нежадная» версия шаблона находит соответствие с первым символом строки, и именно это соответствие является окончательным, а соответствие последующих символов даже не рассматривается.