如何从同一个Perl正则表达式中捕获多个匹配项?

时间:2010-05-21 18:25:12

标签: regex perl string

我正在尝试解析单个字符串,并从具有相同正则表达式条件的相同字符串中获取多个数据块。我正在解析一个静态的HTML文档(由于未公开的原因,我无法使用HTML解析器来完成这项工作。)我有一个表达式如下:

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

我希望获得1美元的价值。但是,在一个字符串中,有很多像这样的img标签,所以我需要像返回的数组(@ 1?)这样可能吗?

4 个答案:

答案 0 :(得分:22)

作为Jim的回答,使用/ g修饰符(在列表上下文中或循环中)。

但要注意贪婪,你不希望.*匹配超过必要(并且不要逃避&lt; =,它们并不特别)。

while($string =~ /<img\s+src="(.*?)"/g ) {
  ...
} 

答案 1 :(得分:10)

@list = ($string =~ m/\<img\ssrc\="(.*)"/g);

g 修饰符匹配字符串中的所有匹配项。列表上下文返回所有匹配项。请参阅perlop中的 m // 运算符。

答案 2 :(得分:5)

你只需要在比赛结束时使用全局修饰符/ g。然后循环 直到没有剩余的匹配

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

答案 3 :(得分:3)

使用左侧的/ g修饰符和列表上下文,如

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