如何编写正则表达式,将a
替换为b
,将b
替换为a
,以便a&b
成为b&a
?< / p>
更新
它应该将所有a
替换为b
,将每个b
替换为a
。 a&b
只是举例说明我想要的。对不起,感到困惑。
答案 0 :(得分:4)
您可以使用捕获组和位置替换来执行此操作:
pax$ echo 'a&b' | perl -pne 's/([^&]*)&(.*)/\2&\1/'
b&a
(blah blah)
位捕获&#34; blah blah&#34;并将其保存在寄存器中,以便以后在替换字符串中使用。与\1
等替换部分一起使用时,捕获的文本将放在结果中。
因此正则表达式只是将所有非符号字符捕获到寄存器1中,然后将字符串的所有其余部分捕获到寄存器2中。
在替换中,它给你寄存器2,一个&符号,然后注册1。
如果您在评论中提到要进行&
和|
,则还需要捕获并使用运算符:
pax$ echo 'a&b' | perl -pne 's/([^&|]*)([&|])(.*)/\3\2\1/'
b&a
pax$ echo 'a|b' | perl -pne 's/([^&|]*)([&|])(.*)/\3\2\1/'
b|a
您可以看到位置替换现在略有不同,因为您正在捕获更多组,但概念仍然相同。
答案 1 :(得分:3)
传统的通用方式是:
my $string = "abcdefedcba";
my %subst = ( 'a' => 'b', 'b' => 'a' );
$string =~ s/(@{[ join '|', map quotemeta, sort { length($b) <=> length($a) } keys %subst ]})/$subst{$1}/g;
print $string;
非一般性地:
$string =~ s/(a|b)/{a=>'b',b=>'a'}->{$1}/ge;
答案 2 :(得分:2)
根据您的最新说明:
$str =~ tr/ab/ba/;
答案 3 :(得分:0)
我想建议这个答案的变体。 Beginner Regex: Multiple Replaces
$text =~ s/(cat|tomatoes)/ ${{ qw<tomatoes cat cat tomatoes> }}{$1} /ge;
答案 4 :(得分:0)
另一种可能性是做3 s///
。
$_ = 'a&b'
# First, change every 'a' to something that does not appear in your string
s/a/\0/g;
# Then, change 'b' to 'a'
s/b/a/g;
# And now change your special character to b
s/\0/b/g;