поиск определенных последовательностей букв в строке букв

У меня есть строка букв, и мне нужно найти определенные последовательности букв, например. BAENNN (N может быть любой буквой алфавита) или BAEMOP и позиция, в которой заканчивается эта последовательность букв. Таким образом, вывод должен быть последовательностью и позицией, в которой она заканчивается. В строке букв может быть несколько последовательностей букв, просто в разных позициях.

Это то, что у меня есть до сих пор:

#!/usr/bin/perl
use warnings;
use strict;
use diagnostics;

my $string = a long string of letters
if $string =~ m/regex/; {
    print the repeat and the position where that letter sequence ends. 

каким будет код регулярного выражения, который мне нужно будет ввести? я бы подумал, что это было бы

m/(BAE[A-Z][A-Z][A-Z] | BAEMOP)/;
   print $1 

а затем что-то связанное с функцией pos(). но я получаю только одно значение.

спасибо ребята за помощь!!


person tmoneyz    schedule 22.02.2017    source источник


Ответы (1)


if запускается только один раз. Вам нужен цикл, если вы хотите сопоставить несколько раз. Кроме того, вам нужно добавить модификатор /g, чтобы начать следующее совпадение с того места, где осталось предыдущее.

Также обратите внимание, что BAEMOP соответствует BAENNN, поэтому в регулярном выражении он не нужен.

Ваша идея правильная, но синтаксис неправильный. Для условий нужны круглые скобки (кроме модификаторов постфикса), пробел вокруг | не игнорируется регулярным выражением, если только вы не используете модификатор /x.

#!/usr/bin/perl
use strict;
use warnings;
use feature qw{ say };

#                      1         2
#             12345678901234567890123456789
my $string = 'AAABBBCCCDDDEEEBAEZZZXBAEABCZ';

while ($string =~ /(BAE[A-Z]{3})/g) {
    say $1, ' at ', pos $string;
}

Выход:

BAEZZZ at 21
BAEABC at 28

Если искомые последовательности могут перекрываться, вам понадобятся утверждения look-around. Подробнее см. perlre.

person choroba    schedule 22.02.2017
comment
Большое спасибо, что нашли время, чтобы сделать это. Я понял!! :) - person tmoneyz; 22.02.2017