我有一个字符串
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]
答案 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有一个很棒的故障 - 检查出来)。希望这对你有帮助!