索引函数中的正则表达式

时间:2011-09-11 22:03:19

标签: regex perl indexing position

我在文本文件中寻找“CCGTCAATTC(A | C)TTT(A | G)AGT”的出现。

$text = 'CCGTCAATTC(A|C)TTT(A|G)AGT'; if ($line=~/$text/){ chomp($line); $pos=index($line,$text); }

搜索工作正常,但我无法获得“文字”的排名。 似乎索引不接受正则表达式作为子字符串。

我该怎样才能做到这一点。 感谢

4 个答案:

答案 0 :(得分:13)

@-数组保存上次成功匹配的起始位置的偏移量。第一个元素是整个匹配模式的偏移量,后续元素是带括号的子模式的偏移量。因此,如果您知道匹配,则可以将其偏移量设为$-[0]

答案 1 :(得分:2)

您根本不需要使用index,只需使用正则表达式。在您的正则表达式匹配之前的$line部分将存储在$`(或$PREMATCH,如果您选择使用英语;)。您可以通过检查$`的长度来获取匹配的索引,然后您可以从$&(或$MATCH)变量中获取匹配项:

$text = 'CCGTCAATTC(A|C)TTT(A|G)AGT';
if ($line =~ /$text/) {
    $pos = length($PREMATCH);
}

假设您希望$pos继续匹配$line的剩余部分,您可以使用$'(或$POSTMATCH)变量来获取比赛结束后的$line

有关这些特殊变量的详细信息,请参阅http://perldoc.perl.org/perlvar.html

答案 2 :(得分:1)

根据您的评论,您所看到的就是匹配后直接匹配50个字符。因此,一个简单的解决方案是:

my ($match) = $line =~ /CCGTCAATTC[AC]TTT[AG]AGT(.{50})/;

如您所见,[AG]相当于A|G。如果您希望多次匹配,可以在正则表达式上使用数组@matches/g全局选项。 E.g。

my @matches = $line =~ /CCGTCAATTC[AC]TTT[AG]AGT(.{50})/g;

您可以这样做以保持匹配模式:

my ($pattern, $match) = $line =~ /(CCGTCAATTC[AC]TTT[AG]AGT)(.{50})/g;

或循环:

while ($line =~ /(CCGTCAATTC[AC]TTT[AG]AGT)(.{50})/g;) {
    my ($pattern, $match) = ($1, $2);
}

答案 3 :(得分:0)

while ($line =~ /(CCGTCAATTC[AC]TTT[AG]AGT)(.{50})/g;) {

我喜欢它,但;中没有while

我很难找到错误的原因。 T_T。