替换ruby中括号之间的特定字符

时间:2012-09-07 21:03:12

标签: ruby regex

我有一个字符串

str = "'${1:textbox}',[${2:x},${3:y},${4:w},${5:h}]"

我想用一个空格替换,[之间的所有]

我试图使用像

这样的东西
str.gsub!(/(?<=\[)\,*?(?=\])/," ")

没有成功。但是,如果我用\,替换表达式中的.,我会得到预期的输出:

str.gsub!(/(?<=\[).*?(?=\])/," ")

== "'${1:textbox}',[  ]"

有人可以解释在这种情况下使用的正确的正则表达式技术,也许还可以解释为什么我上面发布的示例失败并成功了?

我正在使用ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-darwin10.8.0]

2 个答案:

答案 0 :(得分:5)

这个正则表达式:

/(?<=\[)\,*?(?=\])/

正在寻找一个开头括号,后跟一系列逗号(任意长度),后跟一个右括号。这意味着这样的事情:

[]
[,]
[,,,,,,,,,,,]

你的字符串看起来不像那样,所以你的第一个gsub!没有做任何事情。如果你这样做:

'[,,,,,,]'.gsub(/(?<=\[),*?(?=\])/, " ")

你的麻烦会得到'[ ]'

你的第二个正则表达式:

/(?<=\[).*?(?=\])/

有效,因为.*?匹配任何内容(当然受新行和/m/s修饰符约束)以及[]之间字符串的部分当然有资格作为任何事情

如果你想要产生这个:

"'${1:textbox}',[${2:x} ${3:y} ${4:w} ${5:h}]"

然后我会使用Xavier Holt's嵌套gsub方法,这很简单干净。

答案 1 :(得分:4)

有可能用一个正则表达式做到这一点,但即使它是,我可以保证它将超出描述丑陋。使用“嵌套”替换要简单得多 - 使用一个gsub查找括号中的子串,然后使用另一个替换逗号:

str.gsub(/\[.*?\]/) do |substr|
    substr.gsub(',', ' ')
end

我担心我无法解释为什么你的尝试失败了 - 他们都不会为我而战(ruby 1.8.7 / irb 0.9.5)。 IRB提出的错误模糊地说“糟糕的正则表达式语法”。而且我无法理解他们应该如何工作(编辑:mu太短在his answer有一个很棒的故障 - 检查出来)。希望这对你有帮助!