Путаница из-за жадного оператора Regex и завершающего символа - PullRequest
2 голосов
/ 23 ноября 2011

Я готовлюсь к экзамену SCJP, и следующий ложный вопрос застал меня врасплох. Объяснение в инструменте было не очень хорошим, поэтому я надеюсь, что знающие люди из SO смогут это объяснить.

С помощью регулярного выражения C.*L укажите слова, которые он будет захватывать из CooLooLCuuLooC

Я выбрал CooL and CuuL. Моя причина такого выбора заключается в том, что я полагал, что он будет искать начальное совпадение с буквой C, затем будет принимать любой символ ноль или более раз, пока он не найдет L, а затем завершится.

Однако, ответ на самом деле CooLooLCuuL. Я не понимаю, как первые 2 L справляются?

Может ли кто-нибудь прояснить это для меня?

Спасибо

Ответы [ 3 ]

3 голосов
/ 23 ноября 2011

Еще одно, возможно, полезное объяснение:

.* соответствует чему угодно (кроме по умолчанию новых строк !!!!), ноль или более раз - вы, как правило, понимали это.Однако .*? также соответствует этому определению.Разница в жадности ...

  • .* будет соответствовать чему-либо до тех пор, пока не будет соответствовать чему-либо другому ('жадный' или 'нетерпеливый')
  • .*? будет соответствоватьчто угодно, пока не будет сопоставлено следующее выражение («не жадный» или «неохотный»)

Таким образом, 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.

2 голосов
/ 23 ноября 2011

Это потому, что это greedy search и будет соответствовать как можно большему количеству символов, а затем возвращаться, пока не найдет символ L.

Вот отличный ресурс для получения дополнительной информации по этому вопросу:1005 *http://www.regular -expressions.info / repeat.html

2 голосов
/ 23 ноября 2011

C.*L соответствует CooLooLCuuL, потому что это жадный. Он будет пытаться переварить как можно больше, находясь в поиске совпадения, до тех пор, пока не останется больше строки, с которой вы сопоставляете, чтобы найти правильное совпадение. C.*?L не является жадным и поэтому соответствует CooL, так как будет выполнено, когда будет найдено первое совпадение. Он даже пропустит достаточно строки для второго совпадения CuuL.

...