【问题标题】:How to find double letters and replace them with triple letters?如何找到双字母并用三字母替换它们?
【发布时间】:2019-06-03 00:09:05
【问题描述】:

我没有使用任何特定的编码语言,只是一个带有“查找”和“替换”的程序,其中两个字段都使用正则表达式。例如,短语

too many professionals

会变成

tooo many professsionals

我想“找到”任何出现的双字母,我知道我可以这样做

(.)\1

让我感到困惑的是“取双倍的字母并将它的三倍”位。正则表达式中是否有任何符号表示“当前字符”或类似的东西?

编辑:谢谢大家的建议。事实证明,“替换”字段实际上并没有使用Regex,IMO是胡扯,我的问题现在毫无价值。

【问题讨论】:

  • 您能否向我们展示您拥有的 输入 以及您期望的 输出 的示例?
  • 替换为捕获组时使用的语法取决于实现。可能是\1,也可能是$1,也可能是别的什么
  • tooo 的情况下需要什么输出?

标签: regex regex-group backreference


【解决方案1】:

您当前使用反向引用的模式(.)\1 是正确的。试试这个查找和替换:

Find:    (.)\1
Replace: $1$1$1

Demo

这种方法匹配任何单个字母后跟相同的字母,然后用三个相同的字母替换该对。

【讨论】:

    【解决方案2】:

    Tim 的表达式不正确,因为(.) 指的是任何字符,我们不希望替换它。我们只希望替换(英文)字母或[A-Za-z]

    这样做的正确方法可能是带有i 标志的表达式:

    ([a-z])\1
    

    或者可能是没有i标志的表达式:

    ([A-Za-z])\1
    

    Demo

    测试

    const regex = /([a-z])\1/gmi;
    const str = `too many   professionals
    would    turn into
    
    tooo many professsionals`;
    const subst = `$1$1$1`;
    
    // The substituted value will be contained in the result variable
    const result = str.replace(regex, subst);
    
    console.log('Substitution result: ', result);

    正则表达式电路

    jex.im 可视化正则表达式:

    【讨论】:

      【解决方案3】:

      两倍到三倍

      查找(?m)(?:([a-zA-Z])(?!\1)|^)(([a-zA-Z])\3)(?!\3)
      替换$1$2$3

      https://regex101.com/r/tOpl82/1

      解释

       (?m)                          # Multi-line mode     
       (?:
            ( [a-zA-Z] )                  # (1), Character behind
            (?! \1 )                      #      not a dup.
         |                              # or, 
            ^                             # BOL
       )
       (                             # (2 start)
            ( [a-zA-Z] )                  # (3), Character to dup check
            \3                            #      this is duped.
       )                             # (2 end)
       (?! \3 )                      # The dup can't be a triple
      

      【讨论】:

      • 唯一的答案,考虑到已经三个字母可能不应该得到“四合一”并且不会匹配=)
      【解决方案4】:

      这几乎是你问题的一部分:)。

      这还取决于您使用的正则表达式风格。

      例如对于 gnu sed,它是

      $ echo 'ffoobarr' | sed -e 's/\(.\)\1/\1\1\1/g'
      fffooobarrr
      

      所以,为了增加三倍,我只是使用\1\1\1 作为替换模式。

      【讨论】:

        【解决方案5】:

        另一个考虑到三个字母不应该附加第四个的想法。

        (([A-Za-z])\2\2+)|(\w)\3
        

        替换为:

        $1$3$3$3
        

        我们的想法是在第一组中捕获三个或多个字母 | 或在第三组中捕获两个字母。任何一个组都可以匹配:第 1 组或第 3 组。作为替换,任何一个组都将始终为空。

        Here is the demo at regex101

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-11-11
          • 2017-05-16
          • 2014-12-21
          • 1970-01-01
          • 1970-01-01
          • 2017-11-05
          • 2016-12-22
          • 1970-01-01
          相关资源
          最近更新 更多