我想用 $$ 替換 $ 字符,除非 $ 后跟^
, @
, (
, 或之一$
。
例如給出:
$(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 正則運算式進行替換,也許使用斷言或環顧四周?
uj5u.com熱心網友回復:
我想用 $$ 替換 $ 字符,除非 $ 后跟 ^、@、( 或 $ 之一。
展望未來。
s/ \$ (?! [\^\@(\$] ) / '$$' /xeg
但這不能正確處理 $$。
它按照你說的你想要的去做。
$
但是,如果$
緊接其前面的字符數是奇數,您似乎有一個未說明的要求忽略字符。
一個簡單的處理方法是簡單地替換$$
而$
不是后跟^
/ @
/ )
。
s/ \$ (?: \$ | (?! [\^\@\(] ) ) / '$$' /xeg
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/533742.html
標籤:正则表达式perl