PERL - статьи


Логические операции в регулярных выражениях - часть 22


$text = " Now is the time."; $text =~ s/^\s+//; print $texts; Now is the time.

Чтобы отсечь "хвостовые" пробелы, годится команда:

$text = "Now is the time. "; $text =~ s/\s+$//; print $texts; Now is the time.

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

Например в тексте нужно найти текст, находящийся между открывающим и закрывающим тегом:

$text="<a>blah-blah</a>"; if($text=~m!<([a|b])>(.*?)/\1!ig){ print "$2\n"; }

найдет все слова, стоящие между тегами <a></a> и <b></b>.

В регулярных выражениях пристутствует своя семантика: быстрота, торопливость и возврат. Если квантификатор * совпадает во многих случаях, то в результате быдет выведен наибольший по длинне результат. Это жадность. Быстрота: поиск старается найти как можно быстрее. "Text"=~/m*/, по смыслу символов m нет, но в результате будет возвращено значение 0. Т.е. формально 0 и более символов.

$test="aaooee ooaao"; $test=~s/o*/e/; print $test; eaaooee ooaao

потому что 1 элемент сторки - 0 и более символов.

Если добавить квантификатор g, то результат будет таким:

eaeaeeeeee eeaeaee

т.к строка содержит 13 мест, где может встречатся o, в том числе и пустых.

Модификаторы:

  • /i игнорировать регистр
  • /x игнорировать пропуски в шаблоне и разрешить комментарии.
  • /g модификатор разрешающий выполнение поиска/замены везде, где это возможно
  • /gc не сбрасывается позиция при неудачном поиске.
  • /s разрешается совпрадение . с \n, игнорируется $*.
  • /m разрешить совпадение ^ и $ для начала и конца строки во внутренних переводах строк
  • /o однократная компиляция
  • /e правая часть s/// представляет собой выполняемый код
  • /ee правая часть s/// выполняется, после чего возвращаемое значение интерпретируется снова.



  • - Начало -  - Назад -  - Вперед -