Регулярные выражения
Regular expressions, или регулярные выражения - способ определения символьной маски для последующего сравнения с ней строки символов или для обработки строк.
Регулярные выражения Perl - мощный инструмент для поиска и обработки текста, в то же время позволяющий реализовать в одной строке программного кода довольно сложные операции.
В качестве примера можно привести такую задачу: нужно заменить в какой-либо строке все знаки "+" на пробелы. В воплощении на C это выглядело бы так:
void PlusToSpace(char *str) { register int i; for (i=0;str[i];i++) if(str[i]=='+') str[i]=' '; }
На Perl же эта задача выполняется гораздо быстрее:
$str=~tr/+/ /;
Именно это и дает Perl'у преимущество перед программами, например, на C, в применении в web-области.
Формат выражения выглядит так:
/pattern/где pattern и представляет собой маску, состоящую из любых элеменов из этого списка:
/pattern/ | Соответствие |
x? | ноль или один символ 'x' |
x* | ноль или больше символов 'x' |
x+ | один или больше символов 'x' |
.* | ноль или больше любых символов |
.+ | один или больше любых символов |
{m} | 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 символ (пробел, табуляция, новая строка), то же что и [\n\t\r\f] |
\s+ | один или больше space символов, то же что и [\n\t\r\f] |
\S | один не-space символ, то же что и [^\n\t\r\f] |
\S+ | один или больше не-space символов, то же что и [^\n\t\r\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/; | проверяет, содержит ли строка символы, не являющиеся буквами латинского алфавита и цифрами |
Использование regular expressions
=~ (проверка соответствия строки маске)
Этот оператор выполняет функцию, схожую c функцией оператора ==, сравнивая переменную, содержащую строку с маской.
Пример 1:
$string="I love cgi"; if($string=~/cgi/) { print "верно"; }
Пример 2:
$string="chmod 755 test.cgi"; if($string=~/[a-z]+\s\d+\s.*/) { print "верно"; } # 'chmod' -- [a-z]+ - 1 или больше букв # ' ' -- \s - 1 пробел # '755' -- \d+ - 1 или больше цифр # ' ' -- \s - 1 пробел # 'test.cgi' -- .* - дальше идут любые символы
Пример 3: проверка, e-mail адреса
$string="billgates@microsoft.com"; if($string=~/\w+\@\w+\.\w+/) { print "верно"; } # 'billgates' -- \w+ - 1 или больше букв/цифр # '@' -- \@ - символ @ # 'microsoft' -- \w+ - 1 или больше букв/цифр # '.' -- \. - символ . # 'com' -- \w+ - 1 или больше букв/цифр
!~ (проверка несоответствия строки маске)
Этот оператор является обратным оператору =~ (так же как != явл обратным по отношению к ==).
tr (перевод)
Аргументами этой функции эвляются две маски с одинаковым количеством элементов.
$string=tr/SEARCHLIST/REPLACELIST/;
А занимается она тем, что заменяет элемент из SEARCHLIST соответствующим элементом из REPLACELIST.
Пример 1:
$string="testing"; $string=~tr/et/ET; # Сейчас $string="TEsTing"; $string=~tr/a-z/A-Z/; # А сейчас $string="TESTING";
Пример 2:
$string="I+like+CGI"; $string~tr/+/ /; # Сейчас $string="I Like CGI"
s (замена)
Эта функция заменяет часть строки, соответствующую PATTERN на REPLACE.
$string=s/PATTERN/REPLACE/eg;
Где 'e' и 'g' - необязательные параметры:
- g - заменяет все встречающиеся части строка, соответствующие PATTERN. Если этот параметр опущен - заменяет только первое соответствие.
- e - означает что REPALCE является выражением, а не просто строкой (в REPLACE содержатся переменные)
Пример 1:
$string="i:love:perl"; $string=~s/:/*/; # now $string="i*love:perl" $string=~s/:/*/; # now $string="i*love*perl" $string=~s/*/+/g; # now $string="i+love+perl" $string=~s/+/ /g; # now $string="i love perl" $string=~s/perl/cgi/; # now $string="i love cgi"
Пример 2:
$string="i love perl"; $string=~s/(love)/<$1>/; # теперь $string="iperl" # Сдесь первое найденное слово "love" # присваевается переменной $1
Пример 3:
$string="www22cgi44"; $string=~s/(\d+)/$1*3/eg; #сейчас $string="www66cgi132"; # Параметр 'e' показывает # что $1*2 - вычисление, а не просто строка
/pattern/
Работу этой функции поясняют примеры:
Пример 1
$string="chmod 711 cgi"; $string=~/(\w+)\s+(\d+)/;
- (\w+) соответствует любому количуству букв. Соотвествие, найденное в строке будет присвоено переменной $1.
- \s+ соответствует любому количуству пробелов.
- (\d+) соответствует любому количуству цифр. Соотвествие, найденное в строке будет присвоено переменной $2.
Теперь $1="chmod", $2="711"
Пример 2:
$string="chmod 711 cgi"; @list=split(/\s+/,$string); # разбить строку $string, # используя пробелы # в качестве разделителей
Получим массив:
@list=("chmod","711","cgi");
Оставить комментарий
Комментарии
сенкъю вери мач....