Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11642
Последний выпуск: 19.06.2015

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

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="i  perl"

# Сдесь первое найденное слово "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");

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
Аноним
+4 / -0
Мне нравитсяМне не нравится
3 января 2006, 00:59:50
респект вам..большой респект... по вашему курсу шаблонов разоьрался с рег-експами...
сенкъю вери мач....
2.
Аноним
+3 / -1
Мне нравитсяМне не нравится
3 ноября 2005, 16:54:53
Статья получилась достаточно хорошо написанной и, к моему удивлению, наиболее понятной из всех тех которые я недавно просмотрел. Очень пронравилось краткое и локаничное изложение с насущными примерами. Да, пожалуй благодаря примерам и комментариям можно что-либо понять о регулярных выражения :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог