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