我有一个包含字符对的字符串,我想用一个字符替换每个字符。我怎么能这样做?
这是来自question的official FAQ。我们是importing the perlfaq to Stack Overflow。
答案 0 :(得分:9)
(这是official perlfaq answer,减去任何后续修改)
您可以使用替换运算符查找字符对(或字符集)并将其替换为单个实例。在此替换中,我们在(.)
中找到了一个字符。内存括号将匹配的字符存储在后引用\g1
中,我们使用它来要求紧跟其后的相同内容。我们用$1
中的字符替换字符串的那一部分。
s/(.)\g1/$1/g; # 5.10 or later
s/(.)\1/$1/g; # earlier versions
我们也可以使用音译运算符tr///
。在此示例中,tr///
的搜索列表方面不包含任何内容,但c选项对其进行补充,因此它包含所有内容。替换列表也没有任何内容,因此音译几乎是无操作,因为它不会进行任何替换(或者更确切地说,将字符替换为自身)。但是,s
选项会压缩字符串中的重复字符和连续字符,因此字符不会显示在自身旁边
my $str = 'Haarlem'; # in the Netherlands
$str =~ tr///cs; # Now Harlem, like in New York
答案 1 :(得分:0)
$str=~ s/(.)\1+/$1/g;
答案 2 :(得分:0)
这是上一个稳定版本perlfaq4的回答:
如何删除连续的字符对?
(由brian d foy提供)
您可以使用替换运算符查找字符对(或字符集)并将其替换为单个实例。在这个替换中,我们在(。)中找到一个字符。内存括号将匹配的字符存储在后引用\ 1中,我们使用它来要求紧跟其后的相同内容。我们用$ 1中的字符替换字符串的那部分。
s/(.)\1/$1/g;
我们也可以使用音译操作符tr ///。在这个例子中,我们的tr ///的搜索列表方面什么都没有,但是c选项补充了它,所以它包含了所有内容。替换列表也没有任何内容,因此音译几乎是无操作,因为它不会进行任何替换(或者更确切地说,将字符替换为自身)。但是,s选项会压缩字符串中的重复字符和连续字符,因此字符不会显示在自身旁边
my $str = 'Haarlem'; # in the Netherlands
$str =~ tr///cs; # Now Harlem, like in New York