【问题标题】:How do I find the index location of a substring matched with a regex in Perl?如何在 Perl 中找到与正则表达式匹配的子字符串的索引位置?
【发布时间】:2009-05-10 04:18:26
【问题描述】:

我正在遍历一个文件,并且在每一行上我都在寻找一个正则表达式。如果找到正则表达式,我只想打印“它已找到”,然后是在该行中找到它的索引位置。

例子:

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";
        }
}

【问题讨论】:

标签: regex perl


【解决方案1】:

相信你在找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

【讨论】:

  • pos和@position函数一样吗?
  • $1 保存第一个捕获。我使用它是因为我不想硬编码搜索字符串的长度。 pos 函数告诉您在给定字符串中最后一个匹配的位置。 @- 和@+ 数组分别设置为匹配的开始和结束。 $-[0], $+[0] 是整个匹配的开始和结束,$-[1], $+[1] 是第一次捕获的开始和结束,$-[2], $+ [2] 是第二次捕获,依此类推。
  • 如果我没看错,你需要正则表达式 /H(DWFLSFKD)/ 因为他想要 D 之间的位置。我认为星号用于突出显示而不是文字数据。
【解决方案2】:

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

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

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

【讨论】:

  • 我认为这不会奏效。在这种情况下,您期望我的正则表达式将匹配字符串的开头。
  • 这是一种未正确涵盖的附加情况 - 正确的条件是数组的第一个元素与原始字符串不同,正确的索引是第一个数组元素和原始字符串。
猜你喜欢
  • 1970-01-01
  • 2010-09-10
  • 1970-01-01
  • 2015-06-15
  • 2012-06-12
  • 2017-08-29
  • 2021-07-28
  • 2013-06-28
  • 1970-01-01
相关资源
最近更新 更多