将正则表达式仅替换为引用的部分

时间:2011-06-15 13:52:47

标签: perl quotes regex

我需要应用正则表达式过滤来仅影响引号内的文本片段而且我感到很困惑。

 $in = 'ab  c "d e  f" g   h "i    j" k l';
 #...?
 $inquotes =~ s/\s+/_/g; #arbitrary regexp working only on the pieces inside quote marks
 #...?
 $out = 'ab  c "d_e_f" g   h "i_j" k l';

(最终效果可以删除/删除引号,如果这更容易,'ab c d_e_f g ...)

3 个答案:

答案 0 :(得分:3)

你可以找出一些看似线噪声的可爱技巧。

或者您可以保持简单易读,只需使用splitjoin即可。使用引号作为字段分隔符,对每个其他字段进行操作:

my @pieces = split /\"/, $in, -1;

foreach my $i (0 ... $#pieces) {
    next unless $i % 2;
    $pieces[$i] =~ s/\s+/_/g;
}

my $out = join '"', @pieces;

答案 1 :(得分:1)

这样的东西
s/\"([\a\w]*)\"/

应匹配引用的块。我的perl正则表达式语法有点生疏,但是不应该只是将引用文字放在你正在捕获的内容上吗?然后你在第一个捕获组中得到了你引用的字符串d e f,这样你就可以做任何你想做的事了......你想对引用的字符串做什么样的“任意操作”?

嗯。

你可能最好匹配引用的字符串,然后将它们传递给另一个正则表达式,而不是一次性完成。

答案 2 :(得分:1)

如果您只想使用正则表达式,则以下内容应该有效:

my $in = q(ab  c "d e  f" g   h "i    j" k l);

$in =~ s{"(.+?)"}{$1 =~ s/\s+/_/gr}eg;
print "$in\n";

(你说“s可能会掉线:))

HTH,
保罗