我有一个包含二维数组的字符串。
b= "[[1, 2, 3], [4, 5, 6]]"
c = b.gsub(/(\[\[)/,"[").gsub(/(\]\])/,"]")
以上是我决定将其扁平化为:
"[1, 2, 3], [4, 5, 6]"
有没有办法在不进行双gsub
调用的情况下替换最左边和最右边的括号?我正在深入研究正则表达式,并希望看到不同的替代方案。
有时,字符串的格式可能是逗号分隔的1-D数组。
答案 0 :(得分:2)
答案 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"挤压"连续出现特定字符集,您可以使用tr_s
:
"[[1,2],[3,4]]".tr_s('[]','[]')
=> "[1,2],[3,4]"
你说"将所有方括号字符转换为该字符之一"。要使用正则表达式和gsub
执行相同的操作,您可以执行以下操作:
"[[1,2],[3,4]]".gsub(/(\[|\])+/,'\1')