2009-05-07 6 views
4

私はファイルを繰り返し、各行で正規表現を探しています。正規表現が見つかった場合は、「見つかった」とその行にあるインデックスの位置を印刷したいだけです。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"; 
     } 
} 
+0

はhttp://stackoverflow.com/の重複本ではないです質問/ 87380/find-the-find-the-regex-match-in-perl? –

答えて

13

#!/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 
+0

はposで、@position関数は同じですか? –

+0

$ 1は何をしますか? –

+1

$ 1は最初のキャプチャを保持します。私は検索文字列の長さをハードコードしたくないので、私はそれを使用しています。 pos関数は、指定された文字列の中で最後に一致した部分がどこに残っているかを示します。 @と@ +配列はそれぞれ一致の開始と終了に設定されます。 $ - [1]、$ + [1]は最初のキャプチャの開始と終了、$ - [2]、$ + [0] [2]は2番目のキャプチャであり、以下同様です。 –

0

、アレイ内の複数のelemntsがある場合は、正規表現と出力最初の配列要素のサイズを使用して文字列を分割可能性が。 は、簡単なサンプル:

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

編集:これはではなく、完全にあなたのテキストを、あなたの簡単な例にフィットする - 正規表現が複雑になれば、その後、分割基準の大きさが再び柔軟取得します。次に、配列の2番目の要素のインデックスを決定して、分割基準のサイズを決定する必要があります。

#!/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 

あなたはまた@-@+変数を使用することができます:私はあなたがposを探していると信じて

+1

私はそれがかなり動作するとは思わない。この場合、私の正規表現が文字列の先頭に一致することを期待しています。 –

+0

これは正しくカバーされない追加のケースです。正しい条件は、配列の最初の要素が元の文字列と異なり、正しいインデックスが最初の配列要素と元の文字列の間の長さの差です。 – weismat

関連する問題