web-dev-qa-db-ja.com

同じPerl正規表現から複数の一致をキャプチャするにはどうすればよいですか?

単一の文字列を解析して、同じ正規表現条件で同じ文字列から複数のデータチャンクを取得しようとしています。静的な1つのHTMLドキュメントを解析しています(非公開の理由により、HTMLパーサーを使用してジョブを実行することはできません)。次のような式があります。

$string =~ /\<img\ssrc\="(.*)"/;

1ドルの値を取得したいと考えています。しかし、1つの文字列には、このようなimgタグがたくさんあるので、返された配列(@ 1?)のようなものが必要ですか?

25
VolatileRig

ジムの答えとして、/ g修飾子を使用します(リストコンテキストまたはループで)。

しかし、貪欲に注意してください、あなたは.*必要以上に一致させる(そしてエスケープしない<=、それらは特別ではありません)。

while($string =~ /<img\s+src="(.*?)"/g ) {
  ...
} 
22
leonbloy
@list = ($string =~ m/\<img\ssrc\="(.*)"/g);

g修飾子は、文字列内のすべての出現に一致します。リストコンテキストは、すべての一致を返します。 perlopm //演算子を参照してください。

11

マッチの最後に必要なのは、グローバル修飾子/ gだけです。次に、一致するものがなくなるまでループします

my @matches;
while ($string =~ /\<img\ssrc\="(.*)"/g) {
        Push(@matches, $1);
}
5
dalton

/ g修飾子と左側のリストコンテキストを使用します。

@result = $string =~ /\<img\ssrc\="(.*)"/g;
3
Jim Garrison