以递归方式提取给定字符串中引号之间的字符串

Recursively extract strings between quotes in a given string

提问人:Apad 提问时间:6/10/2019 最后编辑:sticky bitApad 更新时间:6/10/2019 访问量:153

问:

给定一个带引号的子字符串,提取所有此类子字符串

我已经编写了以下代码,但有些东西告诉我它很丑陋(尽管它似乎确实可以解决问题)

my $str = 'printf ("hellp;world", and "this is ; also" and )';

loop:
if ($str =~ /"(.*?)"/) {
    my $substr = $1;
    $str =~ s/"$substr"//;
    print "$substr\n";
}
if ($str =~ /"/) {
    goto loop;
}
perl quotes.pl
hellp;world
this is ; also

因此,它确实按预期工作。

字符串 perl 提取 引号

评论

0赞 Håkon Hægland 6/10/2019
子字符串可以转义引号吗?F.D.公司'printf( "hello \"peter\"", ... )'

答:

3赞 melpomene 6/10/2019 #1

您可以通过在任一标量上下文中使用正则表达式标志来直接执行此操作:/g

while ($str =~ /"([^"]*)"/g) {
    print "$1\n";
}

...或列表上下文:

for my $match ($str =~ /"([^"]*)"/g) {
    print "$match\n";
}

我也改成了,因为最好具体说明你想要匹配的内容。.*?[^"]*

/g记录在 perldoc perlop 中:

修饰符指定全局模式匹配,即在字符串中尽可能多地匹配。它的行为方式取决于上下文。在列表上下文中,它返回与正则表达式中任何捕获括号匹配的子字符串列表。如果没有括号,它将返回所有匹配字符串的列表,就好像整个模式周围都有括号一样。/g

在标量上下文中,m//g 的每次执行都会找到下一个匹配项,如果匹配,则返回 true,如果没有进一步的匹配项,则返回 false。可以使用该功能读取或设置最后匹配后的位置;请参阅 Perlfunc 中的“pos”。失败的匹配通常会将搜索位置重置为字符串的开头,但您可以通过添加修饰符(例如 )。修改目标字符串也会重置搜索位置。pos()/cm//gc

(强调我的。