2015-10-05 2 views
6

Мы только что обнаружили ошибку в некотором коде, где программист использовал эквивалент (.)+, когда они должны были использовать (.+). Простое исправление, но мы не можем объяснить поведение (.)+. Может ли кто-нибудь объяснить, почему это соответствует «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' 
+1

Я считаю, что причина этого заключается в том, что она поддерживает совпадение, пока не будет соответствовать шаблону. В этот момент это последний совпадающий символ, который находится в группе захвата. –

+1

Попробуйте добавить 'use re 'debug';' в начало вашего кода. Это хорошо для отслеживания того, что происходит. – Sobrique

+4

Мне нравится объяснение в разделе [Повторение группы захвата против захвата повторяющейся группы] (http://www.regular-expressions.info/captureall.html). – ThisSuitIsBlackNot

ответ

10

Там огромная разница между (.)+ и (.+), но только с точки зрения того, что захватывается, не то, что согласуется.

(.)+ ищет один или несколько экземпляров одного символа и фиксирует последний из них.

(.+) ищет один или несколько символов и захватывает их все сразу.

+0

Я не знаю, как документировано/безопасно '(.) +' Есть. Я бы использовал '(.). *'. – ikegami

+3

@ikegami Не должно быть '. * (.)'? – AnFi

+0

@ Энджел А. Филипп, да! да, я имел в виду '. * (.)' – ikegami

Смежные вопросы