Регулярное выражение в индексной функции - PullRequest
6 голосов
/ 12 сентября 2011

Я ищу вхождение "CCGTCAATTC (A | C) TTT (A | G) AGT" в текстовом файле.

$text = 'CCGTCAATTC(A|C)TTT(A|G)AGT'; if ($line=~/$text/){ chomp($line); $pos=index($line,$text); }

Поиск работает, но яЯ не могу получить положение «текст» в строке.Кажется, индекс не принимает регулярное выражение в качестве подстроки.

Как я могу сделать эту работу.Спасибо

Ответы [ 4 ]

13 голосов
/ 12 сентября 2011

Массив @- содержит смещения начальных позиций последнего успешного совпадения. Первый элемент - это смещение всего совпадающего шаблона, а последующие элементы - это смещения заключенных в скобки подшаблонов. Итак, если вы знаете, что было совпадение, вы можете получить его смещение как $-[0].

2 голосов
/ 12 сентября 2011

Вам вообще не нужно использовать index, просто регулярное выражение. Часть $line, которая предшествует вашему совпадению с регулярным выражением, будет сохранена в $` (или $PREMATCH, если вы решили использовать английский;). Вы можете получить индекс совпадения, проверив длину $`, и вы можете получить само совпадение из переменной $& (или $MATCH):

$text = 'CCGTCAATTC(A|C)TTT(A|G)AGT';
if ($line =~ /$text/) {
    $pos = length($PREMATCH);
}

Предполагая, что вы хотите получить $pos для продолжения сопоставления с оставшейся частью $line, вы можете использовать переменную $' (или $POSTMATCH), чтобы получить часть $line, которая следует за совпадением .

См. http://perldoc.perl.org/perlvar.html для получения подробной информации об этих специальных переменных.

1 голос
/ 12 сентября 2011

Судя по вашим комментариям, кажется, что вы после того, как соответствует 50 символов непосредственно после матча.Итак, простое решение было бы:

my ($match) = $line =~ /CCGTCAATTC[AC]TTT[AG]AGT(.{50})/;

Как видите, [AG] эквивалентно A|G.Если вы хотите совпадать несколько раз, вы можете использовать массив @matches и глобальную опцию /g в регулярном выражении.Например,

my @matches = $line =~ /CCGTCAATTC[AC]TTT[AG]AGT(.{50})/g;

Вы можете сделать это, чтобы сохранить соответствующий шаблон:

my ($pattern, $match) = $line =~ /(CCGTCAATTC[AC]TTT[AG]AGT)(.{50})/g;

Или в цикле:

while ($line =~ /(CCGTCAATTC[AC]TTT[AG]AGT)(.{50})/g;) {
    my ($pattern, $match) = ($1, $2);
}
0 голосов
/ 18 ноября 2012
while ($line =~ /(CCGTCAATTC[AC]TTT[AG]AGT)(.{50})/g;) {

Мне это нравится, но нет ; в while.

Мне было трудно искать причину ошибок.T_T.

...