2013-05-04 2 views
2

Вот строка, которую я ищу.Регулярное выражение Capture and Backrefence

T+4ACCGT+12CAAGTACTACCGT+12CAAGTACTACCGT+4ACCGA+6CTACCGT+12CAAGTACTACCGT+12CAAGTACTACCG 

Я хочу, чтобы захватить цифры позади числа для X разрядов (X является предыдущий номер) Я также хочу, чтобы захватить полную строку.

т.е. захват должен вернуться:

+4ACCG 
+12AAGTACTACCGT 
etc. 

и:

ACCG 
AAGTACTACCGT 
etc. 

Вот регулярное выражение я использую:

(\+(\d+)([ATGCatgcnN]){\2}); 

и я использую $ 1 и $ 3 для захваты.

Что мне не хватает?

+0

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

+0

Что означает N в вашем классе персонажа? –

+0

Это означает символ N. – dstorey

ответ

1

Этот цикл работает, потому что \G утверждение говорит регулярное выражение двигатель, чтобы начать поиск после того, как последнее совпадение (цифра (цифры)) в строке.

$_ = 'T+4ACCGT+12CAAGTACTACCGT+12CAAGTACTACCGT+4ACCGA+6CTACCGT+12CAAGTACTACCGT+12CAAGTACTACCG'; 

while (/(\d+)/g) { 
    my $dig = $1; 
    /\G([TAGCN]{$dig})/i; 
    say $1; 
} 

Результаты

ACCG 
CAAGTACTACCG 
CAAGTACTACCG 
ACCG 
CTACCG 
CAAGTACTACCG 
CAAGTACTACCG 

Я думаю, что это правильно, но не уверен, что: - |

Обновление: Добавлено утверждение \G, которое сообщает регулярному выражению начинать сразу после последнего совпадающего числа.

+0

Отлично, я это реализую сегодня. – dstorey

+0

Хорошо. Рад, что я смог помочь :-) –

+0

Просто FYI - повторное использование $ 1 не работает. 'код while ($ base_string = ~/\ + (\ d +)/ig) { \t \t my $ dig = $ 1; \t \t, если ($ base_string = ~/\ G ([TAGCN] {$ роют})/я) { \t \t \t \t печати "$ роют \ т" $ 1 "\ п"..; \t \t \t} \t \t \t \t} ' – dstorey

3

Вы не можете использовать обратную ссылку в кванторе. \1 - это инструкция, соответствующая тому, что содержит $1, поэтому {\1} недействительный квантификатор. Но зачем вам соответствовать точный номер? Просто сопоставьте буквы (потому что следующая часть снова начинается с +).

Так попробуйте:

(\+\d+([ATGCatgcnN]+)); 

и найти полный матч в $1 и буквы в $2

Другой проблемой в своем регулярном выражении является то, что ваш квантор находится за пределами вашей третьей группы захвата. Таким образом, только последняя буква будет в группе захвата. Поместите квантификатор внутри группы, чтобы захватить всю последовательность.

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

/(\+\d+([ATGCN]+))/gi 
+0

Вам нужно будет захватить '(\ d +)', а также, я думаю. – Alexey

+0

@Alexey, OP захватил цифры, чтобы использовать их в кванторе, но он не хочет, чтобы он был явным результатом. Поскольку этот подход не работает, я удалил эту группу. – stema

+0

@Stema, спасибо за простой ответ. Вместо этого я построю более сложный цикл синтаксического анализа. – dstorey

0
my @sequences = split(/\+/, $string); 

for my $seq (@sequences) { 
    my($bases) = $seq =~ /([^\d]+)/; 
} 
Смежные вопросы