2011-12-08 11 views
2

Perlのgrep関数を使って正規表現のキャプチャされた部分だけを返すことはできますか?Perlのgrepとregexを使ってキャプチャを返すことが可能

use LWP::Simple; 
my $examples_content = get('http://example.com/javascript/reports/examples/'); 
my @hrefs = grep(/href="(.*)"/, split("\n", $examples_content)); 
print $hrefs[0]; 

どうかの印刷されますが次のとおりです:

  • は、スタンドアロンのシングル質問チャート
  • 私はちょうどたいとき:simple_chart.html

    を私は次のようなコードを持っています
    +0

    回答ありがとうございます! –

    +0

    元の問題を解決するには、http://search.cpan.org/~bdfoy/HTML-SimpleLinkExtor-1.25/lib/HTML/SimpleLinkExtorを参照してください。pm – nicomen

    答えて

    6

    なぜgrepを使用していますか?これは、あなたがやりたいことがあります

    my @hrefs = $examples_content =~ /href="(.*?)"/g 
    
    3

    grepは、ジョブの間違ったツールであるかもしれません。 $examples_content =~ /href="(.*?)"/g ...最初にsplitにする必要はありません。?修飾子は、href=".*"パターンがあまり一致しないようにします。

    3

    mapは、いずれかの値を返す返すかどうかによって、容易grepをエミュレートすることができます

    my @hrefs = map(/href="(.*?)"/g, split("\n", $examples_content)); 
    

    を私はスプリットを削除し、ちょうどこの場合にはソースに対してます一致することをAmadanBRPocockに同意します私はこれを答えとして追加して、mapが他のケースでどのように使用できるかを示しました。それを行うには複数の方法の精神で

    、ライン:

    my @hrefs = $examples_content =~ /href="(.*?)"/g; 
    

    も記述できます。

    my @hrefs = map /href="(.*?)"/g, $examples_content; 
    

    注文を好む場合は、[出力が入力を変換][出力入力変換]

    +0

    それを試したことはありません(他の答えはうまくいきました)が、マップを通してオリジナルの出力を実行することを考えていましたが、もちろんワンステップ提案ははるかに優れています。いつものようにTMTOWTDI –

    4

    これはコメント内ですでに言及していますが、bあなたがHTMLを扱っているなら、私はリンクを抽出するモジュールを持っています。私は主に迅速かつ汚い仕事のために、このモジュールを使用

    use HTML::SimpleLinkExtor; 
    
        my $extor = HTML::SimpleLinkExtor->new; 
        $extor->parse($html); 
    
        @a_hrefs  = $extor->a; # by tag 
        @hrefs  = $extor->href; # by attribute 
    

    :あなたがHTML :: Parserのに応じて、気にしない場合、それは悪い小さなツールではありません。実際のHTMLパーサーを使用するので、テキスト内の同様のもの(タグの内部)などの誤検出を抽出しません。

    他のほとんどの人がすでにmapsplitの問題を取り上げていますが、あまりにも正規表現に注意する必要があります。

    my @hrefs = map { 
        /\s href \s* = \s* (['"]) (.*?) \1 /ix ? $2 :() 
        } @lines; 
    

    あなたは異なるクォート文字(またはnoneまったく)、および大文字と小文字を区別を見ることができますタグと属性。どのような仕様や標準が言われても、多くのものが混乱したHTMLを生成し、多くのブラウザがそれをサポートします。私はおそらくまだそのパターンで物事が不足しているでしょう。だから私はモジュールを書いたのです。

    関連する問題