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

Vol*_*Rig 24 regex string perl

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

$string =~ /\<img\ssrc\="(.*)"/;
Run Code Online (Sandbox Code Playgroud)

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

leo*_*loy 22

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

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

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

  • ...但解决贪婪问题的更好方法是使用`"([^"]*)"`.在许多正则表达式引擎中,这将更有效,但更重要的是,它更清晰地表达了你的意图:你想要匹配"后跟一些*非双引号*字符,然后是另一个",而不是两个"字符,用**的任何字符的最短可能序列分隔. (2认同)

小智 10

@list = ($string =~ m/\<img\ssrc\="(.*)"/g);
Run Code Online (Sandbox Code Playgroud)

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


dal*_*ton 5

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

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