在Perl中,如何从字符串中删除连续的字符对?

时间:2010-12-07 12:57:13

标签: regex perl replace

我有一个包含字符对的字符串,我想用一个字符替换每个字符。我怎么能这样做?


这是来自questionofficial FAQ。我们是importing the perlfaq to Stack Overflow

3 个答案:

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