2011-10-19 4 views

答えて

3
$subject =~ s/(?<=^read_data:).*//; 

この単純なperl正規表現は、このトリックを行います。

の作業例は:http://ideone.com/zhGi5

+0

ありがとうございました! –

+0

'/ g'はあまり意味がありません。一致する可能性のあるスポットは1つだけです。あなたの効率に関心があるなら、これは効率的ではありません。/gでは、すべての位置、期間ごとに必要です。/gがなければ、一致する行に続く前に10の異なる位置で一致するようにし、一致しない行のすべての位置で一致するようにする必要があります。私のソリューションは、両方のケースで1つの位置でのみチェックします。 – ikegami

+0

@ikegami gを削除しました。前の正規表現から残されました。 :)。新しいラインに関しては、OPは** NO **の新しいラインがあると述べている。 "read_data:"の後に**行**のすべてのテキストを削除してください。 " – FailedDev

0
#!/usr/bin/env perl 

use warnings; use strict; 

while (my $line = <DATA>) { 
    my ($event) = ($line =~ /^(read_data):/); 
    next unless defined $event; 
    print "$event\n"; 
} 

__DATA__ 
read_data: read failure for 4 bytes to client 158.136.150.108. Error = Connection reset by peer 
+0

私はOPが正規表現を使用したいと思いますか?すなわち「s」機能? – FailedDev

+0

@FailedDev: 's ///'は関数ではなく、演算子です。そして、OPが代用演算子を使用したがっているのはなぜ重要なのでしょうか?時には、もっと簡潔で、 'perldoc perlreref'を起動する必要がないようなことをする別の方法があります。 –

+0

私を信じて、私はそれが何であるか知っています。私はちょうどOPの言葉を使った。 – FailedDev

2

私は

$str =~ s/^read_data\K:.*//; 

高速かつ簡単な(キャプチャを使用していないのおかげで)使用すると思います。改行がある場合は改行も保持します。末尾の改行を削除したい場合は、代わりに以下を使用してください:

$str =~ s/^read_data\K:.*//s; 
関連する問題