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

Регулярные выражения

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

  • r* – нуль и более повторений
  • r+– одно и более повторений
  • r? – нуль или одно повторение
  • r{n} – ровно п повторений
  • r{n}, – n и более повторений
  • r{n,m} – минимум n, максимум m повторений r

Атомарные элементы, или атомы – это простейшие элементы, из которых строится регулярное выражение. Это не обязательно одиночный символ.

Образец Соответствие:

  • /*/ любая строка;
  • /+ / любая непустая строка;
  • / [ 0-9 ] {3} / любая последовательность из трех цифр;
  • /\ [+/ последовательность, состоящая из любого числа символов [.

В первых двух примерах атомом является метасимвол ".". В третьем образце в качестве атома выступает конструкция [0-9], определяющая класс цифровых символов. В четвертом образце атом – это пара символов "\[", включающая метасимвол "\", отменяющий специальное значение следующего за ним метасимвола "[". Полный список атомов мы приведем после изучения всех необходимых синтаксических конструкций.

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

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

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

  • для образца /\d*/ – максимальный фрагмент "1234567";
  • для образца /\d+/ – максимальный фрагмент "1234567";
  • для образца /\d?/ – максимальный фрагмент "1";
  • для образца /\d{2.5}/ – максимальный фрагмент "12345";
  • для образца /\d*?/ – минимальный фрагмент "";
  • для образца /\d+?/ – минимальный фрагмент "1";
  • для образца /\d??/ – минимальный фрагмент "";
  • для образца /\d{2.5}?/ – минимальный фрагмент "12".
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.