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

Replace each pattern in regexp

我很难找到正确的模式来获取我想要的字符串。

我的起始字符串是:

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

我想要

      C3:  [D3,E3,F3]
  1. 我想用双 space
  2. 替换每个起始逗号
  3. 用双 space 和左方括号替换冒号后的逗号
  4. 用右方括号替换尾随逗号

现在,我尝试了这个:

> 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

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

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

要用双 space 替换每个起始逗号,您需要使用 \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]

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

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

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

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

我们现在可以从三个捕获组的内容中形成所需的字符串:

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