我在找到合适的模式以获取我想要的字符串时遇到了一些麻烦。
我的起始字符串是:
,,,,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
在这种情况下,我无法用双倍空格替换每个起始逗号以获得8个空格。
你能帮我找到合适的正则表达式吗?如果可能的话,请改进我的代码吗?
答案 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]"