我有一串字母,我需要找到某些字母序列。 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()函数有关。但我只得到一个值。
谢谢你们的帮助!!答案 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。