使用Ruby正则表达式替换这些括号有不同的方法吗?

时间:2014-10-06 14:02:31

标签: ruby regex

我有一个包含二维数组的字符串。

b= "[[1, 2, 3], [4, 5, 6]]"

c = b.gsub(/(\[\[)/,"[").gsub(/(\]\])/,"]")

以上是我决定将其扁平化为:

   "[1, 2, 3], [4, 5, 6]"

有没有办法在不进行双gsub调用的情况下替换最左边和最右边的括号?我正在深入研究正则表达式,并希望看到不同的替代方案。

有时,字符串的格式可能是逗号分隔的1-D数组。

4 个答案:

答案 0 :(得分:2)

\[(?=\[)|(?<=\])\]

你可以试试这个。“。参见演示。

http://regex101.com/r/hQ1rP0/25

答案 1 :(得分:2)

gsub方法接受哈希,并且使用该哈希中的键/值替换与您的正则表达式匹配的任何内容,如下所示:

b = "[[1, 2, 3], [4, 5, 6]]"
c = b.gsub(/\[\[|\]\]/, '[[' => '[', ']]' => ']')

这可能看起来有些混乱,实际上我可能会在不同的行上定义掉期列表。但是,这可以通过一个gsub以更直观的方式实现您的目标。

另一个选择是利用gsub也接受一个块的事实:

c = b.gsub(/\[\[|\]\]/){|matched_value| matched_value.first}

这里我们匹配任何双开/关方括号,只需取任何匹配的第一个字母。我们可以清理正则表达式:

c = b.gsub(/\[{2}|\]{2}/){|matched_value| matched_value.first} 

这是一种更简洁的方式来指定我们想要恰好匹配两个左括号,或恰好两个右括号。我们还可以改进块:

c = b.gsub(/\[{2}|\]{2}/, &:first)

这里我们使用一些Ruby简写。如果只需要在传递给块的对象上调用简单方法,则可以使用&:表示法来执行此操作。我想我已尽可能简短而甜蜜。快乐的编码!

答案 2 :(得分:1)

甚至不打扰正则表达式,只需做一个简单的字符串切片:

b= "[[1, 2, 3], [4, 5, 6]]"
b[1 .. -2] # => "[1, 2, 3], [4, 5, 6]"
  

字符串的格式可以是逗号分隔的1D数组

然后检测它是否有条件地修改它:

b= "[[1, 2, 3], [4, 5, 6]]"
b = b[1 .. -2] if b[0, 2] == '[[' # => "[1, 2, 3], [4, 5, 6]"

正则表达式不是通用的表达方式,并不是所有东西都是钉在一起的钉子。

答案 3 :(得分:1)

To&#34;挤压&#34;连续出现特定字符集,您可以使用tr_s

"[[1,2],[3,4]]".tr_s('[]','[]')
=> "[1,2],[3,4]"

你说&#34;将所有方括号字符转换为该字符之一&#34;。要使用正则表达式和gsub执行相同的操作,您可以执行以下操作:

"[[1,2],[3,4]]".gsub(/(\[|\])+/,'\1')