Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Регулярные выражения > Помогите понять механизм


Автор: OutlawZ 4.5.2015, 15:12
Добрый день, помогите понять рег выражение, т.е к примеру:

Код

$_ = 'aaa bbb ccc';
/(a{0,3})/;
print $1;


Выведет aaa это понятно так как {0,3} говорит 0,1,2,3 буквы а подряд. 
Дальше выражение а? это 0 или 1 символ а. Ок. это понятно. 

Код

$a = 'abc';
$a =~ /(abc){3,5}?/;
print $1, "\n";


Тогда почему тут не выводится abc  тут стоит ? в конце??? или тут ? играет как выражение которое говорит в том случае если abc идет 3,4,5 раз подрят что то вроде такого ["']? ?

Это еще можно понять но код что ниже просто ввел меня в ступор:
Код

my $b = 'abc';
$b =~ /(\w){2,}?/;
print $1, "\n";


Тут выводится b, если написать {1,} то напечатается a.  Просто как тут тогда работает механизм? он же должен выводить в том случае если к примеру a идет 2 раза подряд? а выводит только символ который соответствует позиции в выражении {1,}. или тут фишка в \w мол все символы [a-zA-Z0-9_], т.е ab считается так как удовлетворяют условие?  помогите понять почему так происходит и какую роль играет тут ?  он используется как выражение к примеру a? - a{0,1} или как ['"]? - если есть символы ' или " ?????? Заранее спасибо.

Автор: alezzz 4.5.2015, 17:30
use re qw(Debug All);  - сложен в понимании, но простые выражения разобрать можно.

Цитата(OutlawZ @  4.5.2015,  15:12 Найти цитируемый пост)
Выведет aaa это понятно так как {0,3} говорит 0,1,2,3 буквы а подряд. Дальше выражение а? это 0 или 1 символ а. Ок. это понятно. код Perl1:2:3:$a = 'abc';$a =~ /(abc){3,5}?/;print $1, "\n";


Код

{n,m}?    Match at least n but not more than m times, not greedily

Это значит что найдет 3 раза 'abc' и не будет искать 5 раз. 

Цитата(OutlawZ @  4.5.2015,  15:12 Найти цитируемый пост)
Это еще можно понять но код что ниже просто ввел меня в ступор:код Perl1:2:3:my $b = 'abc';$b =~ /(\w){2,}?/;print $1, "\n";

Принцип тот-же, ищет по минимуму, т.е. 2, только в $1 запишется только 1 символ, причем последний из 2-х. Чтоб получить 'ab' нужно так написать:
Код

$b = 'abc';
$b =~ /((?:\w){2,}?)/;
print $1, "\n";


Автор: OutlawZ 5.5.2015, 02:22
Спасибо большое, теперь все встало на свои места )

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)