2012-03-08 8 views
1

私は自分自身を教えているので、私はこの言語をかなり熟知しています。私は正規表現について何度も読んできましたが、正しい文脈を理解することはできません。aの後の英数字の文字列を読み取ります。

レッツは、私は、ファイル名を持っていると言う「テストファイル」 このファイルが含まれている3行、私が読んで、後にのみ第三1、すべてをプリントアウトすることができますどのように

test this is the first line 
test: this is the first line 
test; this is the third line 

を:私は、次の手順を実行したいです;のスペースはありません。基本的に

「これは第三のラインである」ので、これは私がこれを誤って編集された$string =~ m/this is the third/

を行うことを考えていますものです。最初と2番目の文では、テストの前にスペースが必要です。だから私は空白を飛ばしたいと思う。

答えて

3

、それは次のようになります。

Axemanの正規表現の使用::もう一つの方法に

#!/usr/bin/env perl 
use strict; 
use warnings; 
use YAPE::Regex::Explain; 
my $expr = q(/^test; (.*\n)/); 
print YAPE::Regex::Explain->new($expr)->explain; 

The regular expression: 

(?-imsx:/^test; (.*\n)/) 

matches as follows: 

NODE      EXPLANATION 
---------------------------------------------------------------------- 
(?-imsx:     group, but do not capture (case-sensitive) 
         (with^and $ matching normally) (with . not 
         matching \n) (matching whitespace and # 
         normally): 
---------------------------------------------------------------------- 
/      '/' 
---------------------------------------------------------------------- 
^      the beginning of the string 
---------------------------------------------------------------------- 
    test;     'test; ' 
---------------------------------------------------------------------- 
    (      group and capture to \1: 
---------------------------------------------------------------------- 
    .*      any character except \n (0 or more times 
          (matching the most amount possible)) 
---------------------------------------------------------------------- 
    \n      '\n' (newline) 
---------------------------------------------------------------------- 
)      end of \1 
---------------------------------------------------------------------- 
/      '/' 
---------------------------------------------------------------------- 
)      end of grouping 
---------------------------------------------------------------------- 
1

あなただけの三行をしたい場合は、単にラインをカウントして、やって:

s/.*;\s*//; 

はまでのすべてを削除します。それの後に空白があります。ただし、3行目に別の ';'が含まれていると、それであなたは困っているでしょう。それは可能性がありますが、1つは、以前に存在することはチャンスがないもしそうなら、次の操作を行います。

s/[^;]*;\s*//; 
最初までまでしか削除させていただきます

「;」 (および末尾の空白)。

しかし、長期的には、特定の形式を含むすべての行に一致させたいと思っていますが、必ずしも "3番目"とは限りません。その場合、

while(<>) { 
    if (/;\s*(.*)/) { 
     print $1; 
    } 
} 

最終目標に近づけることができます。 STDINからつかむ

+1

を:

while (<>) { print if s/.*?;\s*//; } 

あなたはあまりにも、コマンドラインでの素敵なワンライナーにこれらを回すことができます。

その後、STDINから読み込むプログラムを作ることができます。申し訳ありませんが、私はPerlの非常に新しいです。ここではすべてのキャラクターを私に説明してください。s/[^;] *; \ s * //; – NewLearner

+0

ネゲートされた文字クラスの必要はありません。 '/; \ s *(。*)/'はうまく動作します。 @Wes:これは、セミコロンの後に0個以上の空白文字が続き、それに続くすべてをキャプチャすることを意味します。 – Borodin

+0

@borodin:良い点、ありがとう。編集された... –

1

をあなたはYAPE::Regex::Explainは便利なツールであることを見つけるかもしれませんこれを実現するには、最初の;までのすべてのものを削除してください。 gを取り除く。

s/.*?;\s*//; 

この行基本的に言う:「任意の文字に一致する(ただし、できるだけ少ない)、セミコロン、その後、任意のスペース、そして何もそれをすべてを置き換え」。これは素晴らしい答えです

perl -ne 'print if s/.*?;\s*//;' 
0

while (<>) { 
    print $1 if /^test; (.*\n)/; 
} 
関連する問題