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

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

Regular expressions, или регулярные выражения — способ определения символьной маски для последующего сравнения с ней строки символов или для обработки строк.

Регулярные выражения Perl — мощный инструмент для поиска и обработки текста, в то же время позволяющий реализовать в одной строке программного кода довольно сложные операции.

В качестве примера можно привести такую задачу: нужно заменить в какой-либо строке все знаки "+" на пробелы. В воплощении на C это выглядело бы так:

На Perl же эта задача выполняется гораздо быстрее:

Именно это и дает Perl’у преимущество перед программами, например, на C, в применении в web-области.

Формат выражения выглядит так:

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

/pattern/ Соответствие
x? ноль или один символ ‘x’
x* ноль или больше символов ‘x’
x+ один или больше символов ‘x’
.* ноль или больше любых символов
.+ один или больше любых символов
M символов
[] символы, заключенные в []
[^] символы, кроме заключенных в []
[0-9] любая цифра от ‘0’ до ‘9’
[a-z] любая буква от ‘a’ до ‘z’
[^0-9] любой символ, не находящийся между ‘0’ и ‘9’
[^a-z] любой символ, не находящийся между ‘a’ и ‘z’
/^. / первый символ в строке
/. $/ последний символ в строке
d одна цифра, то же, что и [0-9]
d+ одна или больше цифр, то же, что и [0-9]+
D одна не-цифра, то же, что и [0-9]
D+ одна или больше не-цифр, то же, что и [0-9]+
w один alphanumeric символ (латинская буква или цифра), то же, что и [a-zA-Z0-9]
w+ один или больше alphanumeric-символов, то же, что и [a-zA-Z0-9]+
W один не-alphanumeric символ, то же что и [^a-zA-Z0-9]
W+ один или больше не-alphanumeric символ, то же что и [^a-zA-Z0-9]+
s один space символ (пробел, табуляция, новая строка), то же что и [

f]

s+ один или больше space символов, то же что и [

f]

S один не-space символ, то же что и [^

f]

S+ один или больше не-space символов, то же что и [^

f]+

a|b|c ‘a’ или ‘b’ или ‘c’
abc подстрока "abc"
(pattern) () запоминает группу символов, присваивая их переменным $1, $2 и т.д. См. примеры.
/pattern/i игнорировать регистр букв

Это, конечно, не понять с первого раза, поэтому вот примеры:

Пример Описание
$str=

/perl/;

проверяет, есть ли в строке $str подстрока "perl" $str=

/^perl/;

проверяет, начинается ли строка с подстроки "perl" $str=

/perl$/;

проверяет, заканчивается ли строка на подстроку "perl" $str=

/c|g|i/;

проверяет, содержит ли строка символ ‘c’ или ‘g’ или ‘i’ $str=

/cg<2,4>i/;

проверяет, содержит ли строка символ ‘c’, следующие сразу за ним 2-4 символа ‘g’, за которыми следует символ ‘i’ $str=

/cg*i/;

проверяет, содержит ли строка символ ‘c’, слудующие за ним 0 или больше символа ‘g’, за которыми следует символ ‘i’ $str=

/c..i/;

проверяет, содержит ли строка символ ‘c’, и символ ‘i’, разделенные двумя любыми буквами $str=

/[cgi]/;

проверяет, содержит ли строка один из символов ‘c’, ‘g’ или ‘i’ $str=

/d/;

проверяет, содержит ли строка цифру $str=

/W/;

проверяет, содержит ли строка символы, не являющиеся буквами латинского алфавита и цифрами

(проверка соответствия строки маске)

Этот оператор выполняет функцию, схожую c функцией оператора ==, сравнивая переменную, содержащую строку с маской.

Пример 3: проверка, e-mail адреса

(проверка несоответствия строки маске)

Этот оператор является обратным оператору =

(так же как != явл обратным по отношению к ==).

tr (перевод)

Аргументами этой функции эвляются две маски с одинаковым количеством элементов.

А занимается она тем, что заменяет элемент из SEARCHLIST соответствующим элементом из REPLACELIST.

s (замена)

Эта функция заменяет часть строки, соответствующую PATTERN на REPLACE.

Где ‘e’ и ‘g’ — необязательные параметры:

  • g — заменяет все встречающиеся части строка, соответствующие PATTERN. Если этот параметр опущен — заменяет только первое соответствие.
  • e — означает что REPALCE является выражением, а не просто строкой (в REPLACE содержатся переменные)

/pattern/

Работу этой функции поясняют примеры:

  • (w+) соответствует любому количуству букв. Соотвествие, найденное в строке будет присвоено переменной $1.
  • s+ соответствует любому количуству пробелов.
  • (d+) соответствует любому количуству цифр. Соотвествие, найденное в строке будет присвоено переменной $2.

В примере есть не точность:
if ($input <‘siteurl’>=

#http://#) <
print $input<‘siteurl’>;
>
регексп следовало бы записать с оператором "m" — m#http://# . Иначе — это просто комментарий.

2, Krush ( ? ), 17:46, 19/07/2010 [ответить] + / –
Умник, блин. все там верно.
3, Виктор ( ?? ), 16:31, 27/04/2011 [ответить] + / –
В статье ошибка.

* ^ — начало строки;
* $ — конец строки;

* A — начало строки;
*  — конец строки;

на самом деле эти символы делают разные вещи.

Весьма полезный рецепт, который облегчает общение с коммандной строкой описан здесь, однако попробовать его вживую не удалось, т.к. под мою систему (OpenIndiana) не существует компиляторя языка Go. Так возникла идея переписать указанную программу на более универсальный язык, который точно существует на любой платформе — Perl.

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

Реализация

Для начала преобразуем переданные функции подсказки в часть будущего регулярного выражения:

Здесь $hints — строка, склеенная из всех подсказок, например, ‘abcd’.
Выражение для поиска (.) — это одиночный символ (каждый, учитывая параметр поиска ‘g’), заменяем его на себя же ($1 — значение из первых скобок выражения поиска) и дописываем необходимые нам части, а именно:

После каждого символа добавляем блок: ‘.*?’, что означает: любой символ, ноль или более раз, и маркер, который делает модификатор «не жадным» (об этом чуть ниже).

Итого на выходе получаем строку: ‘a.*?b.*?c.*?d.*?’

Переходим к основной части, которая осуществляет сравнение строки из «знакомых» папок с подсказкой, условие:

Здесь символ ‘^’ — это «якорь» начала строки, выражение в первых скобках ‘(.*)’ — префикс строки, а вслед за этим выражением — наш подготовленный заранее regexp, содержащий подсказки для поиска, заканчивается выражение вторым «якорем» — ‘$’, который означает совпадение с концом строки.

Поскольку все модификаторы ‘*’ в строке кроме первого, содержат маркеры ‘?’, единственный модификатор без этого маркера становится «жадным», т.е. старается отобрать себе как можно большую часть строки.

В нашем примере, имеем на выходе преобразованную строку: /^(.*)(a.*?b.*?c.*?d.*?)$/

Фактически, поиск в этом случае осуществляется справа налево, т.е. сначала от конца строки ищем ближайший символ ‘d’, потом слева от него — ближайший символ ‘c’, затем — ближайший к нему слева символ ‘b’ и затем — ближайший к нему вимвол ‘a’, все что будет слева от найденного смвола ‘a’ попадет в «жадный» префикс. Положение найденного результата в строке мы определим по длине этого префикса, а именно строкой $w = length($1); (здесь $1 получит значение из первых скобок предыдущего regexp), остальные условия (чем правее, чем лучше) за нас уже выполнил сам regexp.

Остается только дописать функции LoadPaths и add и добисать обработку параметров запуска.

Читайте также:  О чем снять влог
Ссылка на основную публикацию
Регулятор громкости для автомагнитолы
Бывший хозяин видимо пытаясь снять магнитолу за рукоятку громкости, сломал её. В результате громкость не регулировалась, а отпаявшиеся контакты энкодера...
Работа с far manager
Фар менеджер - один из самых удобных файловых менеджеров, рассчитанный на работу с файлами и папками на дисках, прежде всего,...
Работа с классами python
Серия контента: Этот контент является частью # из серии # статей: Этот контент является частью серии: Следите за выходом новых...
Регулярные выражения perl примеры
Regular expressions, или регулярные выражения - способ определения символьной маски для последующего сравнения с ней строки символов или для обработки...
Adblock detector