我不明白为什么这段代码会起作用:
$seq = 'GAGAGAGA';
my $regexp = '(?=((G[UCGA][GA]A)|(U[GA]CG)|(CUUG)))'; # zero width match
while ($seq =~ /$regexp/g){ # globally
my $pos = pos($seq) + 1; # position of a zero width matching
print "$1 position $pos\n";
}我知道这是一个零宽度匹配,它没有把匹配的字符串放在$&中,但为什么它把它放在$1?
谢谢!
发布于 2010-03-27 19:20:25
由于使用了所有内部括号,因此在$1中捕获匹配项。如果您不想捕获,则使用
my $regexp = '(?=(?:(?:G[UCGA][GA]A)|(?:U[GA]CG)|(?:CUUG)))';甚至更好
my $regexp = qr/(?=(?:(?:G[UCGA][GA]A)|(?:U[GA]CG)|(?:CUUG)))/;从perlre documentation
(?:pattern)(?imsx-imsx:pattern)这是用于集群,而不是捕获;它对像()这样的子表达式进行分组,但不像()那样进行反向引用。所以
@fields = split(/\b(?:a|b|c)\b/)
就像
@fields = split(/\b(a|b|c)\b/)
但不会输出额外的字段。如果不需要捕获字符,不捕获字符的成本也更低。
与(?imsx-imsx)一样,?和:之间的任何字母都用作标志修饰符。例如,
/(?s-i:多于.*).*百万/i
等同于更详细的
/(?:(?s-i)超过.*).*百万/i
发布于 2010-03-27 19:17:10
您的正则表达式包含捕获(...),这意味着将用这些捕获的结果填充$1、$2等变量。这也适用于前视断言(尽管我相信不是后视断言)。
与所有捕获一样,如果重写为(?:...),则内容不会进入捕获变量。
https://stackoverflow.com/questions/2529002
复制相似问题