2013-12-09 5 views
0

Я хотел был бы сопоставить и получить последовательность, такую ​​как abababab, используя счетчик повторений {n}.Perl соответствует двум символам с номером повторения

Это регулярное выражение

my $rec = "xxxxxxababababxxxxxx"; 
$rec =~ /(ab{4})/; 
print $1,"\n"; 

не работает, потому что {4} относится только к b. Как заставить счетчик применяться к нескольким символам?

ответ

7

Вы должны сгруппировать символы, которые вы хотите повторить, включив их в круглые скобки. В регулярном выражении Perl (?:…) - это то же самое, что и обычные скобки, но не Захват.

Так что вы хотите

$rec =~ /((?:ab){4})/; 
+0

Большое спасибо. Мне действительно интересно, где я могу найти такой синтаксис. Я просмотрел несколько книг perl и веб-сайты и не смог найти это решение. – giordano

+1

Ввод «perldoc perlre» в командной строке даст вам полную документацию для регулярных выражений Perl. –

+1

@giordano: шаблон будет работать нормально, используя обычные скобки для скобок '/ ((ab) {4}) /', но он немного менее эффективен, потому что он каждый раз захватывает 'ab' в' $ 2'. Существует много конструкций, которые начинаются с '(?' И они называются [* extended patterns *] (http://perldoc.perl.org/perlre.html#Extended-Patterns). – Borodin

1

«Я хотел бы, чтобы соответствовать и получить последовательность как abababab ...» (курсив, шахта)

Вот более общее регулярное выражение для сопоставления любого набора из двух (не символ новой строки) символов, смежно повторяется четыре раза:

use strict; 
use warnings; 

my $rec = "xxxxxxababababxxxxxx"; 
my ($capture) = $rec =~ /((..)\2{3})/; 
print $capture; 

Выход:

abababab 

Обозначение \2 представляет собой то, что было зафиксировано в предыдущей группе захвата. Таким образом, регулярное выражение «говорит» соответствует двум символам, за которыми следуют три экземпляра этих двух символов ».

Надеюсь, это поможет!

+0

Спасибо за это правило регулярного выражения. – giordano

+0

@giordano - Добро пожаловать! – Kenosis

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