如何使用单个// //所有出现的两个子串进行交换?

时间:2011-06-28 02:49:21

标签: regex perl

如何编写正则表达式,将a替换为b,将b替换为a,以便a&b成为b&a?< / p>

更新

它应该将所有a替换为b,将每个b替换为aa&b只是举例说明我想要的。对不起,感到困惑。

5 个答案:

答案 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;