如何在Perl中找到与正则表达式匹配的子字符串的索引位置?

时间:2009-05-07 04:25:37

标签: regex perl

我正在迭代一个文件,在每一行我正在寻找一个正则表达式。如果找到正则表达式,我只想打印“找到它”,然后打印在该行中找到它的索引位置。

示例:

looking for: 'HDWFLSFKD' need index between two Ds
line: MLTSHQKKF*HDWFLSFKD*SNNYNSKQNHSIKDIFNRFNHYIYNDLGIRTIA
output: 'its found' index location: 10-17

以上'寻找'很简单,但我打算在那里有复杂的正则表达式 所以基本上只是想知道是否在字符串中找到正则表达式然后我们如何得到它的索引位置?

这是我到目前为止的代码:

foreach my $line (@file_data)
{
        if ($line=~ /HDWFLSFKD/){
            print "it's found\n"; 
            print "but at what index are the two Ds";
          }   
        else {
            $sequence.=$line;
            print "came in else\n";
        }
}

2 个答案:

答案 0 :(得分:13)

我相信您正在寻找pos

 #!/usr/bin/perl

use strict;
use warnings;

my $sequence;
while (my $line = <DATA>) {
    if ($line=~ /(HDWFLSFKD)/g){
        print "its found index location: ", 
            pos($line)-length($1), "-",  pos($line), "\n";
    } else {
        $sequence .= $line;
        print "came in else\n";
    }
}

__DATA__
MLTSHQKKF*HDWFLSFKD*SNNYNSKQNHSIKDIFNRFNHYIYNDLGIRTIA
MLTSHQKKFSNNYNSKQNHSIKDIFNRFNHYIYNDLGIRTIA
MLTSHQKKFSNNYNSK*HDWFLSFKD*QNHSIKDIFNRFNHYIYNDLGIRTIA

您还可以使用@-@+变量:

#!/usr/bin/perl

use strict;
use warnings;

my $sequence;
while (my $line = <DATA>) {
        if ($line=~ /HDWFLSFKD/){
                print "its found index location: $-[0]-$+[0]\n";
        } else {
                $sequence .= $line;
                print "came in else\n";
        }
}

__DATA__
MLTSHQKKF*HDWFLSFKD*SNNYNSKQNHSIKDIFNRFNHYIYNDLGIRTIA
MLTSHQKKFSNNYNSKQNHSIKDIFNRFNHYIYNDLGIRTIA
MLTSHQKKFSNNYNSK*HDWFLSFKD*QNHSIKDIFNRFNHYIYNDL

答案 1 :(得分:0)

如果数组中有多个元素,您可以使用正则表达式拆分字符串并输出第一个数组元素的大小。 一个简单的样本:

my $test="123;456";
my @help=split(';', $test);
if ($#help>0) {
    print "Index is:".length($help[0]);
}

编辑:这适用于您的简单示例,但不完全符合您的文本 - 如果正则表达式变得更复杂,那么拆分条件的大小将再次变得灵活。然后,您需要确定数组的第二个元素的索引,以确定拆分条件的大小。