假设我有字符串
- "[1,2,[3,4,[5,6]],7]"
我将如何解析到数组中
- [1,7]
?
嵌套结构和模式在我的用例中是完全任意的.
我目前的ad-hoc解决方案涉及在每个时期之后添加一个空格并使用YAML.load,但如果可能,我想要更清洁一个.
(如果可能,则不需要外部库)
解决方法
正在使用JSON正确解析该特定示例:
- s = "[1,7]"
- #=> "[1,7]"
- require 'json'
- #=> true
- JSON.parse s
- #=> [1,7]
如果不行,可以尝试运行字符串,通过eval
,但您必须确保没有实际的ruby代码被传递,因为eval可以用作注入漏洞.
编辑:这是一个简单的递归,基于正则表达式的解析器,无验证,未测试,不适用于生产使用等:
- 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,7]"
- p my_scan(s).first #=> [1,7]