2014-12-14 6 views
2

Вот мой код ....Perl: Максимум в регулярных выражениях?

#!/usr/bin/perl 

$str = 'yaeeeeeeeeeeeeeeeeeeeeah'; 
$six = 6; 
$eight = 8; 

if($str =~ /e{$six,$eight}?/) 
{ 
print "matches"; 
} 

По какой-то причине это все еще соответствует, даже если число е превышает максимум 8. Как я могу сделать с регулярным выражением вернуться ложным, если есть более 8 Э?

+2

Успокойтесь, это не так. Попробуйте 'print '' $ &'\n";' Должен напечатать 6 e. – sln

ответ

3

Обычно его /(?<!e)e{$six,$eight}(?!e)/

Проверить http://www.perlmonks.org/?node_id=518444

Для очень плохой случай, когда в одной и той же строке, 6-8 Э существуют где-то, но где-то
еще, по отдельности, существует 20 е, решение отправил не поможет.

Пример: rrrrrrrreeeeeeerrrrrrrrrrreeeeeeeeeeeeeee

В этом случае вы должны выглядеть путь вперед за плохой случай первого e{9},
то хорошее дело e{6,8}.

/^(?!.*e{$nine}).*(?<!e)e{$six,$eight}(?!e)/ 
2

Ваша строка соответствует выражениям, так как содержит шесть e. Если вы не хотите соответствовать, измените выражение. Например, вы можете сказать, что последовательность е х не предшествует и затем еще е:

/(?<!e) e{$six,$eight} (?!e)/x 

Они называются отрицательными Двойник позади и смотреть вперед утверждения.

Вопросительный знак после того, как квантификатор не имеет никакого значения в таком случае.