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/;
/^perl/;
/perl$/;
/c|g|i/;
/cg<2,4>i/;
/cg*i/;
/c..i/;
/[cgi]/;
/d/;
/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’. После каждого символа добавляем блок: ‘.*?’, что означает: любой символ, ноль или более раз, и маркер, который делает модификатор «не жадным» (об этом чуть ниже). Итого на выходе получаем строку: ‘a.*?b.*?c.*?d.*?’ Переходим к основной части, которая осуществляет сравнение строки из «знакомых» папок с подсказкой, условие: Здесь символ ‘^’ — это «якорь» начала строки, выражение в первых скобках ‘(.*)’ — префикс строки, а вслед за этим выражением — наш подготовленный заранее regexp, содержащий подсказки для поиска, заканчивается выражение вторым «якорем» — ‘$’, который означает совпадение с концом строки. Поскольку все модификаторы ‘*’ в строке кроме первого, содержат маркеры ‘?’, единственный модификатор без этого маркера становится «жадным», т.е. старается отобрать себе как можно большую часть строки. В нашем примере, имеем на выходе преобразованную строку: /^(.*)(a.*?b.*?c.*?d.*?)$/ Фактически, поиск в этом случае осуществляется справа налево, т.е. сначала от конца строки ищем ближайший символ ‘d’, потом слева от него — ближайший символ ‘c’, затем — ближайший к нему слева символ ‘b’ и затем — ближайший к нему вимвол ‘a’, все что будет слева от найденного смвола ‘a’ попадет в «жадный» префикс. Положение найденного результата в строке мы определим по длине этого префикса, а именно строкой $w = length($1); (здесь $1 получит значение из первых скобок предыдущего regexp), остальные условия (чем правее, чем лучше) за нас уже выполнил сам regexp. Остается только дописать функции LoadPaths и add и добисать обработку параметров запуска. |