在一串字母中找到某些字母序列

时间:2017-02-22 04:12:25

标签: regex string perl letters

我有一串字母,我需要找到某些字母序列。 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()函数有关。但我只得到一个值。

谢谢你们的帮助!!

1 个答案:

答案 0 :(得分:3)

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

如果您要查找的序列可能重叠,则需要环顾断言。有关详细信息,请参阅perlre