Еще одно, возможно, полезное объяснение:
.*
соответствует чему угодно (кроме по умолчанию новых строк !!!!), ноль или более раз - вы, как правило, понимали это.Однако .*?
также соответствует этому определению.Разница в жадности ...
.*
будет соответствовать чему-либо до тех пор, пока не будет соответствовать чему-либо другому ('жадный' или 'нетерпеливый') .*?
будет соответствоватьчто угодно, пока не будет сопоставлено следующее выражение («не жадный» или «неохотный»)
Таким образом, C.*L
найдет заглавную C
, затем сопоставит ooLooLCuuLooC
с .*
,Затем он найдет, что он должен соответствовать заглавной L
.Находясь в конце строки, это невозможно, поэтому он идет туда, где он может соответствовать L
, заставляя .*
отказаться от символов LooC
, чтобы сделать это.Результат: CooLooLCuuL
Если вы будете использовать C.*?L
, он найдет C
, затем совпадет с o
, проверяя следующее o
на соответствие L
.Это потерпит неудачу, сделав совпадение с oo
и проверив следующее L
на совпадение с L
.Это будет успешно выполнено и будет возвращено CooL
.
Третий вариант для сопоставления либо CooL
или CuuL
(то есть любые строки, которые начинаются с C
и заканчиваются L
) будетC[^L]*L
.Это соответствует C
, затем любое количество символов, которые не являются заглавными L
, затем заглавными L
.