【问题标题】:In Perl, how do I remove consecutive pairs of characters from a string?在 Perl 中,如何从字符串中删除连续的字符对?
【发布时间】:2011-05-21 13:54:48
【问题描述】:

我有一个包含字符对的字符串,我想用单个字符替换每个运行。我该怎么做?


这是来自official FAQquestion。我们是importing the perlfaq to Stack Overflow

【问题讨论】:

    标签: regex perl replace


    【解决方案1】:

    (这是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”是十进制整数,允许使用更安全的反向引用表示法以及相对反向引用。
    • 除了 REQUIRING 5.10 之外,没有必要在此答案中使用超过 \1 的内容。
    • @MkV,将\gN\g{N} 添加到语言中是有原因的。最初的方式有一个错误特征,即它与您进入八进制转义的方式几乎相同。由于本文档主要面向新的 Perl 程序员,因此首先向他们展示更安全的方式非常有意义。
    【解决方案2】:
    $str=~ s/(.)\1+/$1/g;
    

    【讨论】:

      【解决方案3】:

      这是来自上一个稳定版本的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
      

      【讨论】:

      • 如果可能的话,作者自己发布答案会很好(即布赖恩应该从稳定或大师发布他的新答案)。
      • @Ether 和 @MkV 布赖恩和我使用stackoverflow.com/users/532928/perlfaq 使用faq.perl.org 上提供的版本发布这些问题 这些问题是使用perlfaq 帐户发布的,因此我们不会获得代表它们和答案都标记为 CW,以便更容易改进答案。我认为发布几乎相同版本的答案(以获得代表增益)而不是编辑现有答案的意义不大。
      • @Sinan:好吧,我误会了;我的印象是,对于某些问题,blead 的答案与“官方发布”的版本完全不同。如果差异很小,我同意简单地编辑现有的响应。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-03
      • 2011-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多