替换正则表达式中的每个模式

时间:2016-01-22 09:52:46

标签: ruby-on-rails ruby regex gsub

我在找到合适的模式以获取我想要的字符串时遇到了一些麻烦。

我的起始字符串是:

,,,,C3:,D3,E3,F3,,

我想

      C3:  [D3,E3,F3]
  1. 我想用双倍空格替换每个起始逗号
  2. 用双倍空格和左方括号
  3. 替换冒号后的昏迷
  4. 用右方括号替换尾随逗号
  5. 现在,我试过这个:

    > 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
    

    在这种情况下,我无法用双倍空格替换每个起始逗号以获得​​8个空格。

    你能帮我找到合适的正则表达式吗?如果可能的话,请改进我的代码吗?

2 个答案:

答案 0 :(得分:6)

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

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

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

请参阅IDEONE demo

s = ",,,,C3:,D3,E3,F3,,"
puts s.gsub(/\G,/, '  ').sub(/,+\z/, ']').sub(/:,+/, ':  [')

输出:

        C3:  [D3,E3,F3]

答案 1 :(得分:0)

要构建所需的字符串,需要知道:

  • 前导逗号的数量(包含前导逗号的字符串的大小)
  • 领先逗号之后的字符串,包括冒号
  • 冒号后面的逗号和两个或多个逗号之间的字符串

构造一个将这三个字符串中的每一个保存到捕获组的正则表达式是一件简单的事情:

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]"