2017-04-16 102 views

回答

6

一個JSON解析器應該很好地工作:

require "json" 

str = "[[591, 184] , [741, 910] , [987,512], [2974, 174]]" 
p JSON.parse(str) 
# => [[591, 184], [741, 910], [987,512], [2974, 174]] 

嘗試在eval.in:https://eval.in/777054

0

您必須使用 「EVAL」:

> str = "[[591, 184] , [741, 910] , [987,512], [2974, 174]]" 
# => "[[591, 184] , [741, 910] , [987,512], [2974, 174]]" 
> arr = eval str 
# => [[591, 184], [741, 910], [987, 512], [2974, 174]] 
+3

雖然技術上成立,'eval'絕對是不得已而爲之。由於這些數據是有效的JSON,喬丹有一個更好的主意。 – tadman

2

一種方式做此:

str = "[[591, 184] , [741, 910] , [987,512], [2974, 174]]" 
reg = /(?<=\[)[\d,?\s?]+(?=\])/ 
str.scan(reg).map { |s| s.scan(/\d+/).map(&:to_i) } 
#=> [[591, 184], [741, 910], [987, 512], [2974, 174]] 

或採取葉出@喬丹的書,但使用YAML:

require 'yaml' 
str = "[[591, 184] , [741, 910] , [987,512], [2974, 174]]" 
YAML.load(str) #=> [[591, 184], [741, 910], [987, 512], [2974, 174]] 
+0

我對字符類'[\ d,?\ s?] +'感到困惑。在一個字符類中,問號是從字面上理解的,所以這將匹配一個或多個數字,逗號,問號或空白字符。 –

1

我會splitscan分兩步進行。

str = "[[591, 184] , [741, 910] , [987,512], [2974, 174]]" 

str.split(/\]\s*,\s*\[/).map { |s| s.scan(/\d+/).map(&:to_i) } 
    #=> [[591, 184], [741, 910], [987, 512], [2974, 174]] 

注意

str.split(/\]\s*,\s*\[/) 
    # => ["[[591, 184", "741, 910", "987,512", "2974, 174]]"] 
相關問題