2011-09-11 7 views
5

"CCGTCAATTC(A | C)TTT(A | G)AGT"の出現をテキストファイルで探しています。インデックス関数の正規表現

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

探索が働いているが、私はラインで、「テキスト」の位置を取得することはできませんよ。 インデックスは部分文字列として正規表現を受け入れていないようです。

この作業を行うにはどうすればよいですか。 ありがとう

答えて

13

@-配列は、最後に成功した一致の開始位置のオフセットを保持します。最初の要素はマッチングパターン全体のオフセットで、後続の要素は括弧でくくられたサブパターンのオフセットです。一致があった場合は、オフセットを$-[0]として取得できます。

1

indexはまったく正規表現ではありません。あなたの正規表現の前に来る$lineの部分は、$`(または英語を使うことを選択した場合は$PREMATCH)に格納されます。あなたは$`の長さをチェックして、一致のインデックスを取得することができ、あなたは$&(または$MATCH)変数から試合自体を取得することができます:あなたは残りのマッチングを継続する$posを取得したいと仮定すると、

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

$lineの一部である場合は、$'(または$POSTMATCH)変数を使用して、一致後の部分の$lineを取得することができます。

これらの特殊変数の詳細については、http://perldoc.perl.org/perlvar.htmlを参照してください。

+0

はい、私はそれを行うことができます。しかし、私がそのポジションを獲得すると、次の50文字をキャプチャします。 'substr($ line、$ pos、50)' – Deep

+0

$ lineの残りの部分について、あなたが言ったようにマッチさせることができます。何らかの理由? $ '(または$ POSTMATCH)変数を使用して、$ lineの残りの部分を簡単に取得することもできます。 –

+0

私の修正された答えをご覧ください。あなたが何か他のものを探しているなら、私に知らせてください。 –

1

あなたのコメントに基づいて、試合の直後に50文字がマッチしているようです。だから、簡単な解決策は次のようになります。

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

ご覧のとおり、[AG]A|Gと同等です。複数回一致させる場合は、配列@matchesと正規表現のグローバルオプション/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); 
} 
+0

実際には、私は一致する文字が必要なので、50を置く代わりにカンニングしなければならないでしょう38 – Deep

+0

あなたの質問は、あなたが望むものを最初から言ったと答えたら? =)まあ、あなたがキャプチャしたい文字の数を知っているとすれば、それを修正する方法を考えることができると思います。 – TLP

+0

これも私に別のアイデアを与えたので、TLP – Deep

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

私はそれが好きませんが、whileには;

私は、エラーの理由を検索するのに苦労しました。 T_T。