首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么正向先行会导致Perl正则表达式中的捕获?

为什么正向先行会导致Perl正则表达式中的捕获?
EN

Stack Overflow用户
提问于 2010-03-27 18:58:44
回答 2查看 961关注 0票数 2

我不明白为什么这段代码会起作用:

代码语言:javascript
复制
$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?

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2010-03-27 19:20:25

由于使用了所有内部括号,因此在$1中捕获匹配项。如果您不想捕获,则使用

代码语言:javascript
复制
my $regexp = '(?=(?:(?:G[UCGA][GA]A)|(?:U[GA]CG)|(?:CUUG)))';

甚至更好

代码语言:javascript
复制
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

票数 6
EN

Stack Overflow用户

发布于 2010-03-27 19:17:10

您的正则表达式包含捕获(...),这意味着将用这些捕获的结果填充$1$2等变量。这也适用于前视断言(尽管我相信不是后视断言)。

与所有捕获一样,如果重写为(?:...),则内容不会进入捕获变量。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2529002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档