2010-12-19 10 views
2

とn番目の発生を抽出します。私はちょうど第六及び第七縦棒の間のものを抽出したいは、私はこのような行を解析するための最良の方法を見つけようとしていますPerlの正規表現


Explicit|00|11|Hello World|12 3 134||and|blah|blah|blah

|
私はこの問題は、最初の部分があるため.*の可能性最も長いシーケンスにマッチしているようだ、おそらく私が使用してしなければならない別の何かがあるということです

if ($line =~ /^(.*\|){6}(\w*)\|/) { 
    print $2; 
} 

のようなものを試してみました。縦棒の間には、英数字、スペース、句読点があります。

私はそれらの間で最短に一致する必要がありますか?

+0

「|」に分割してみませんか? – Shurdoof

+0

あなたは正しいです。私はちょうど正規表現をしばらくプレイしているので、他の関数を使うことさえ考えていないと思います:) – MCH

答えて

8

代わりに.*?を使用して、*を変更してより多くの回数を減らすことができます。

このフィールドは、必要なフィールドに単語以外の文字が含まれていると、間違った場所でも一致する可能性があります。これを防ぐには、明示的に何かを言うか、 (([^|]*\|){6})、またはその部分のバックトラッキングを無効にします(((?>.*?\|)){6})。 |

+0

ああ、それは素晴らしいことです。はい、私はちょうど分割を使用し、より理にかなっています。 – MCH

3

使用スプリット

if (my $seventh = (split /\|/, $line, 8)[6]) { 
    print $seventh; 
} 

(8はオプションであり、第七に達した後はもうしようと気にしないように分割するよう指示します):

それとも、ただの分割を使用することができます。 my @fields = split /\|/, $strのようなものが動作するはずです。次に、興味のあるフィールドのインデックスを作成します(空のフィールドも保存されます)。 |正規表現の演算子としてエスケープする必要があります。

関連する問題