【发布时间】:2022-11-15 13:03:29
【问题描述】:
我想用 $$ 替换 $ 字符,除非 $ 后跟 ^、@、( 或 $ 之一。
例如给出:
$(bar) $@ $$.z $^.zh $(foo) $foo $bar
我想要:
$(bar) $@ $$.z $^.zh $(foo) $$foo $$bar
我有一个残酷的 hack 方法来做到这一点(用一个临时的可能是唯一的垃圾序列替换我不想修改的模式),替换剩下的所有东西,然后撤消我的临时模式。
my $var = ' $(bar) $@ $$.z $^.zh $(foo) $foo $bar ';
my $d = '$';
my $at = '@';
$var =~ s/\$\(/<<<<DDDDBBBB>>>>/g;
$var =~ s/\$\@/<<<<DDDDAAAA>>>>/g;
$var =~ s/\$\^/<<<<DDDDCCCC>>>>/g;
$var =~ s/\$\$/<<<<DDDDDDDD>>>>/g;
$var =~ s/\$/$d$d/g;
$var =~ s/<<<<DDDDBBBB>>>>/$d(/g;
$var =~ s/<<<<DDDDAAAA>>>>/$d$at/g;
$var =~ s/<<<<DDDDCCCC>>>>/$d^/g;
$var =~ s/<<<<DDDDDDDD>>>>/$d$d/g;
print "$var\n";
这有效,但它很难看。我天真的一次班轮尝试是:
my $var = ' $(bar) $@ $$.z $^.zh $(foo) $foo $bar ';
print "$var\n";
my $d = '$';
$var =~ s/\$([^\@\(\$\^])/$d$d$1/g;
print "$var\n";
但这不能正确处理 $$。 $$ 的第一个匹配项无法按需要替换,但是“$.” “$$”的一部分。字符序列被替换,给出:
$(bar) $@ $$$.z $^.zh $(foo) $$foo $$bar
我可以做一个混合体:
my $var = ' $(bar) $@ $$.z $^.zh $(foo) $foo $bar ';
my $d = '$';
my $at = '@';
print "$var\n";
$var =~ s/\$\$/<<<<DDDDDDDD>>>>/g;
$var =~ s/\$([^\@\(\^])/$d$d$1/g;
$var =~ s/<<<<DDDDDDDD>>>>/$d$d/g;
print "$var\n";
但这仍然很丑陋,只是没那么糟糕。有没有办法用一个 perl 正则表达式来做这个替换,也许使用断言或环视?
【问题讨论】: