1

我有一个字符串

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]

4

2 回答 2

5

使用单个正则表达式可能可以做到这一点,但即使是这样,我也可以保证它会变得难以描述。使用“嵌套”替换要简单得多 - 使用一个 gsub 查找带括号的子字符串,然后使用另一个替换逗号:

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

恐怕我无法解释为什么你的尝试失败了——它们都不适合我(ruby 1.8.7 / irb 0.9.5)。IRB 给出的错误含糊地说是“错误的正则表达式语法”。而且我无法完全理解它们应该如何工作(编辑:mu 太短了,他的回答中有一个很棒的细分- 看看)。无论如何,希望这有帮助!

于 2012-09-07T21:50:52.163 回答
5

这个正则表达式:

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

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

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

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

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

你会得到一个'[ ]'为你的麻烦。

你的第二个正则表达式:

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

之所以有效,是因为.*?匹配任何内容(当然,受换行符和/mand/s修饰符的影响),并且字符串的部分介于[and]当然有资格作为任何东西

如果你想产生这个:

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

然后我会使用Xavier Holt 的嵌套gsub方法,它简单而干净。

于 2012-09-07T22:00:39.007 回答