【发布时间】:2011-05-21 13:54:48
【问题描述】:
我有一个包含字符对的字符串,我想用单个字符替换每个运行。我该怎么做?
这是来自official FAQ 的question。我们是importing the perlfaq to Stack Overflow。
【问题讨论】:
我有一个包含字符对的字符串,我想用单个字符替换每个运行。我该怎么做?
这是来自official FAQ 的question。我们是importing the perlfaq to Stack Overflow。
【问题讨论】:
(这是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
【讨论】:
g(在\g1)什么时候溜进来的?它不在 5.12.1 的 POD 中,但我可以在 github 中看到它。这是未来(5.13+)的事情吗?
\g 结构是在 5.10.0 中引入的。来自perl5100delta:新语法\g{N} 或\gN 其中“N”是十进制整数,允许使用更安全的反向引用表示法以及相对反向引用。
\gN 和\g{N} 添加到语言中是有原因的。最初的方式有一个错误特征,即它与您进入八进制转义的方式几乎相同。由于本文档主要面向新的 Perl 程序员,因此首先向他们展示更安全的方式非常有意义。
$str=~ s/(.)\1+/$1/g;
【讨论】:
这是来自上一个稳定版本的perlfaq4 的答案:
如何删除连续的字符对?
(由布赖恩·德·福伊提供)
您可以使用替换运算符来查找字符对(或一系列字符)并将它们替换为单个实例。在这个替换中,我们在 (.) 中找到一个字符。内存括号将匹配的字符存储在反向引用 \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
【讨论】:
perlfaq 帐户发布的,因此我们不会获得代表它们和答案都标记为 CW,以便更容易改进答案。我认为发布几乎相同版本的答案(以获得代表增益)而不是编辑现有答案的意义不大。