Ruby on rails 替换regexp中的每个模式

Ruby on rails 替换regexp中的每个模式,ruby-on-rails,ruby,regex,gsub,Ruby On Rails,Ruby,Regex,Gsub,我很难找到合适的模式来得到我想要的字符串 我的起始字符串是: ,,,,C3:,D3,E3,F3,, 我想要 C3: [D3,E3,F3] 我想用双空格替换每个起始逗号 用两倍空格和左方括号替换结肠后昏迷 用右方括号替换尾随逗号 目前,我尝试了以下方法: > a = ",,,,C3:,D3,E3,F3,," => ",,,,C3:,D3,E3,F3,," > b = a.gsub(/^,*/, " ").gsub(/(?<=:),/, " [").gs

我很难找到合适的模式来得到我想要的字符串

我的起始字符串是:

,,,,C3:,D3,E3,F3,,
我想要

      C3:  [D3,E3,F3]
  • 我想用双空格替换每个起始逗号
  • 用两倍空格和左方括号替换结肠后昏迷
  • 用右方括号替换尾随逗号
  • 目前,我尝试了以下方法:

    > a = ",,,,C3:,D3,E3,F3,,"
    => ",,,,C3:,D3,E3,F3,,"
    > b = a.gsub(/^,*/, "  ").gsub(/(?<=:),/, "  [").gsub(/[,]*$/,"" ).gsub(/[ ]*$/, "]")
    => "  C3:  [D3,E3,F3]"
    > b == "        C3:  [D3,E3,F3]"
    => false
    
    >a=“,,,,C3:,D3,E3,F3,”
    =>“,,,C3:,D3,E3,F3,,”
    >b=a.gsub(/^,*/,“”)。gsub(/(?“C3:[D3,E3,F3]”)
    >b==“C3:[D3、E3、F3]”
    =>错误
    
    在这种情况下,我无法用双空格替换每个起始逗号以获得8个空格


    您能帮我找到正确的regexp吗?如果可能的话,请改进我的代码?

    要用双空格替换每个起始逗号,您需要使用
    \G
    运算符,即
    .gsub(/\G,/,'')
    。该运算符告诉正则表达式引擎在字符串开头匹配,然后在每次成功匹配后匹配。因此,您只需将字符串开头的每个连续逗号替换为
    。gsub(/\G,/,“”)

    然后,您可以添加其他替换:

    s.gsub(/\G,/, ' ').sub(/,+\z/, ']').sub(/:,+/, ': [')
    

    输出:

            C3:  [D3,E3,F3]
    

    要构造所需字符串,需要知道:

    • 前导逗号的数量(由前导逗号组成的字符串的大小)
    • 前导逗号后面的字符串,包括冒号
    • 冒号后面的逗号和两个或多个逗号之间的字符串
    构造将这三个字符串中的每一个保存到捕获组的正则表达式很简单:

    r = /
        (,*)   # match leading commas in capture group 1
        (.+:)  # match up and including colon in capture group 2
        ,      # match comma     
        (.+)   # match any number of any characters in capture group 3
        ,,     # match two commas
        /x     # extended/free-spacing regex definition mode
    
    ",,,,C3:,D3,E3,F3,," =~ r
    
    现在,我们可以从三个捕获组的内容中形成所需的字符串:

    "#{'  '*$1.size}#{$2} [#{$3}]"
      #=> "       C3: [D3,E3,F3]"
    

    是否满足您的要求?谢谢,我不知道\G模式。仅供参考,我还在您的一个正则表达式中去掉了lookbehind,lookbehind是非常昂贵的正则表达式子模式。由于您知道上下文(它是
    ),您可以匹配它,然后轻松地重新插入替换模式。另一种方法是
    ,,hi“.gsub(/^,+)/,''*'\1'.size)
    。但是,我很困惑,为什么在没有捕获组的情况下可以这样做:
    “,,hi.gsub(/^,+/,''*'\1'.size)
    (我在测试之前确实重新加载了IRB。)@CarySwoveland:它的工作方式与您想象的不一样:
    “\1”。大小始终是
    2
    ,因为
    \1
    被视为一个文本字符串。
    放置“\1”。大小总是两个。-这会起作用,但会涉及更多的编码。
    
    "#{'  '*$1.size}#{$2} [#{$3}]"
      #=> "       C3: [D3,E3,F3]"