2010-12-04 19 views
1

私はラインperlの正規表現の問題

オブジェクト1のこれらの種類を持っている:object2は:オブジェクト3:行の残り

私はコロンまで、各テキストを抽出するための正規表現をしたいです。

この場合、私が必要:ラインの

$ 1 =物体1 $ 2 =オブジェクト2 $ 3 =オブジェクト3 $ 4 =残り

私はこれを試みた:

$_ =~ m/\(.*\):\(.*\):\(.*\):\(.*\)/i

でも動作しないようです。

どこが間違っていますか?あなたは\年代削除する必要があり

答えて

3

:あなたの正規表現には文字だけでなく、あなたが選択することができますmを持っていないので

$_ =~ m/(.*?):(.*?):(.*?):(.*)/i 

はまた、i(大文字と小文字を区別しないマッチング)が冗長です/以外の異なる正規表現の境界文字。 Perlのデフォルト値が$_であるため、$_ =~も必要ありません。 splitは正確にあなたがしたいんどのような時に、なぜあなたは、このための正規表現を使用している

/(.*):(.*):(.*):(.*)/ 

http://ideone.com/TLepM

+0

完璧ですが、他の問題が見つかりました:行が – Kerby82

+0

の場合最初の3つを非貪欲にしたい場合があります。 "残りの行"にコロンがある場合は、期待通りに終わらないかもしれません。 –

+0

@Graeme Perrow exact !!!!私はこの問題をどのように解決するか? – Kerby82

4

:だから、それを減らすことができますか?

$x = "object1:object2:object3:rest of the line"; 
@x = split (":", $x); 
foreach $s (@x) { 
     print "$s\n"; 
} 

この出力:

​​

あなたは関係なく、コロンの数の4つの分野に自分自身を制限したい場合は、あなたが使用することができます。

$x = "object1:object2:object3:rest of the line with a : character"; 
@x = split (":", $x, 4); 
foreach $s (@x) { 
     print "$s\n"; 
} 

出力:

object1 
object2 
object3 
rest of the line with a : character 
+0

+1これは良い方法です。しかし、@ FMのような4つのトークンを自分の答えに追加することはできますか? – marcog

+0

申し訳ありません@paxdiabloしかし、私は分割を使用することはできません:-) – Kerby82

1
my @objects = split ':', $data_line, 4;