Ruby:将嵌套数组的字符串表示形式解析为数组?

标签 ruby regex arrays parsing

假设我有字符串

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

我如何将其解析为数组

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

?

嵌套结构和模式在我的用例中是完全任意的。

我目前的临时解决方案包括在每个句点后添加一个空格并使用 YAML.load,但如果可能的话,我想要一个更简洁的解决方案。

(如果可能,不需要外部库的一个)

最佳答案

使用 JSON 正确解析了该特定示例:

s = "[1,2,[3,4,[5,6]],7]"
#=> "[1,2,[3,4,[5,6]],7]"
require 'json'
#=> true
JSON.parse s
#=> [1, 2, [3, 4, [5, 6]], 7]

如果这不起作用,您可以尝试通过 eval 运行字符串, 但您必须确保没有传递任何实际的 ruby​​ 代码,因为 eval 可能被用作注入(inject)漏洞。

编辑:这是一个简单的递归的、基于正则表达式的解析器,没有验证,没有测试,不用于生产等:

def my_scan s
  res = []
  s.scan(/((\d+)|(\[(.+)\]))/) do |match|
    if match[1]
      res << match[1].to_i
    elsif match[3]
      res << my_scan(match[3])
    end
  end
  res
end

s = "[1,2,[3,4,[5,6]],7]"
p my_scan(s).first #=> [1, 2, [3, 4, [5, 6]], 7]

关于Ruby:将嵌套数组的字符串表示形式解析为数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4477127/

相关文章:

php - 正则表达式,贪婪 |

ruby - 如何使用 ruby​​ 将新行写入文件?

ruby - 如何使用 Go 共享库在 Ruby 中传递字符串数组并获取字符串数组?

javascript - 正则表达式 JavaScript 问题

c++ - 从箭头键获取输入

ios - Swift 3 - viewdidload 中的函数未完全执行

c - "void foo(int q[][4]){}"中的 q 是什么类型?使用 "void foo(int q[6][4]){}"与前者有何不同?

css - 每行四个产品 Bootstrap/ROR 停止使用添加的信息?

ruby-on-rails - 如何使用opencv-ruby gem裁剪图像?

r - 在 stringr 中使用 perl/regex 到 upper\U