1

Для регулярных выражений часто желательно сделать часть выражения нежадной. Для этого мы используем знак вопроса.

В чем разница между (.*?) и (.*)? когда используется как часть большего выражения, чтобы захватить ноль или более символов?

Например, будет:(.*?)ng когда-нибудь даст другой результат, чем (.*)?ng ?

Конечные результаты одинаковы (подтверждено https://regex101.com/), но есть ли различия, которые не так очевидны?

1 ответ1

0

Как уже упоминалось в моей другой ответ, .*? версия ленивая Это означает, что часть, заключенная в скобки, будет применяться к как можно меньшему количеству совпадений с регулярным выражением. Версия с вопросительным знаком вне скобок является жадной: она будет применяться к как можно большему количеству символов.

Оба выражения будут иметь одинаковый эффект, если вы посмотрите только на совпадение, а не на совпадение. Два подстановочных знака получат совпадение, если это возможно, но один минимизирует захваченное количество, а другой максимизирует его. Они отличаются, однако, тем, что они захватывают.

Давайте посмотрим пример захвата различий: singing . Он содержит буквально ng дважды. В (.*?)ng , (.*?) будет хватать все до первой ng - как только он это увидит, все готово: лень. В этом случае он будет захватывать si . (.*)?ng будет пытаться захватить как можно больше - это жадно - оставляя только последний ng . Здесь фиксируется singi .

Если во входной строке не будет нескольких экземпляров детали вне группового символа, вы не увидите разницы.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .