Мы только что обнаружили ошибку в некотором коде, где программист использовал эквивалент (.)+
, когда они должны были использовать (.+)
. Простое исправление, но мы не можем объяснить поведение (.)+
. Может ли кто-нибудь объяснить, почему это соответствует «e», последняя буква, а не «b», первая буква после «a» в регулярном выражении? Как бы вы описали (.)+
?Каково поведение (.) + В регулярном выражении?
my $s = 'abcde';
if ($s =~ m{ a (.)+ }x){
print "s '$s' matched '$1'\n";
}else{
print "total match fail\n";
}
__END__
output:
s 'abcde' matched 'e'
Я считаю, что причина этого заключается в том, что она поддерживает совпадение, пока не будет соответствовать шаблону. В этот момент это последний совпадающий символ, который находится в группе захвата. –
Попробуйте добавить 'use re 'debug';' в начало вашего кода. Это хорошо для отслеживания того, что происходит. – Sobrique
Мне нравится объяснение в разделе [Повторение группы захвата против захвата повторяющейся группы] (http://www.regular-expressions.info/captureall.html). – ThisSuitIsBlackNot