Иллюстрированный самоучитель по Perl



         

Метасимволы - часть 3


Алгоритм, применяемый в операциях поиска и замены (см. ниже) для обработки регулярных выражений, содержащих множители, является "жадным": он пытается найти для образца, снабженного множителем, максимальный сопоставимый фрагмент текста. Рассмотрим, например, что происходит при поиске в строке

"Скроен колпак не по-колпаковски, надо колпак переколпаковать" фрагмента, удовлетворяющего образцу /. * колпак/.

Алгоритм найдет максимальный фрагмент, удовлетворяющий выражению . * (вся строка без завершающего символа новой строки), затем начнет двигаться назад, отбрасывая в найденном фрагменте по одному символу, до тех пор, пока не будет достигнуто соответствие с образцом. Найденный фрагмент будет иметь вид "Скроен колпак не по-колпаковски, надо колпак переколпак".

Можно заставить алгоритм работать иначе, снабдив множитель "*" модификатором "?". В этом случае алгоритм из "жадного" превращается в "ленивый" и будет для образца, снабженного множителем, искать минимальный соответствующий фрагмент. "Ленивый" алгоритм для множителя "*?" начнет поиск в строке с пустого фрагмента "", добавляя к нему по одному символу из строки до тех пор, пока не достигнет соответствия с образцом. В этом случае найденный фрагмент будет иметь вид "Скроен колпак". Все сказанное справедливо и для других множителей. Например, в строке "1234567" будет найден:

  • для образца /\d*/ — максимальный фрагмент "1234567";
  • для образца /\d+/ — максимальный фрагмент "1234567";
  • для образца /\d?/ — максимальный фрагмент "1";
  • для образца /\d{2,5}/ — максимальный фрагмент "12345";
  • для образца /\d*?/ — минимальный фрагмент "";
  • для образца /\d+?/ — минимальный фрагмент "1";
  • для образца /\d??/ — минимальный фрагмент "";
  • для образца /\d{2,5}?/ — минимальный фрагмент "12".



  • Содержание  Назад  Вперед