Жадная и ленивая квантификация
В некоторых реализациях квантификаторам в регулярных выражениях соответствует максимально длинная строка из возможных (квантификаторы являются жадными,англ. greedy). Это может оказаться значительной проблемой. Например, часто ожидают, что выражение (<.*>)
найдёт в тексте теги HTML. Однако, если в тексте есть более одного HTML-тега, то этому выражению соответствует целиком строка, содержащая множество тегов.
<p><b>Википедия</b> — свободная энциклопедия, в которой <i>каждый</i> может изменить или дополнить любую статью.</p>
Эту проблему можно решить двумя способами.
- Учитывать символы, несоответствующие желаемому образцу (
<[^>]*>
) для вышеописанного случая). - Определить квантификатор как нежадный (ленивый, англ. lazy) — большинство реализаций позволяют это сделать, добавив после него знак вопроса.
Использование ленивых квантификаторов может повлечь за собой обратную проблему, когда выражению соответствует слишком короткая, в частности, пустая строка.
*
*?
+
+?
{n,}
{n,}?
Пример использования жадных и ленивых выражений
Выражение (<.*>)
соответствует строке, содержащей несколько тегов HTML-разметки, целиком.
<p><b>Википедия</b> — свободная энциклопедия, в которой <i>каждый</i> может изменить или дополнить любую статью.</p>
Чтобы выделить отдельные теги, можно применить ленивую версию этого выражения:(<.*?>)
Ей соответствует не вся показанная выше строка, а отдельные теги (выделены цветом):
<p><b>Википедия</b> — свободная энциклопедия, в которой <i>каждый</i>может изменить или дополнить любую статью.</p>