2017-04-16 1 views

Répondre

6

Un analyseur JSON doit fonctionner correctement:

require "json" 

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

Essayez sur eval.in: https://eval.in/777054

0

Vous devez utiliser "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

Bien que techniquement vrai, 'eval' est un dernier recours. Puisque ces données sont valides JSON, Jordan a une meilleure idée. – tadman

2

Une façon de faire ceci:

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]] 

ou de prendre une feuille de @ livre de Jordan, mais en utilisant YAML:

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

Je suis confus à propos de la classe de caractères '[\ d,? \ S?] +'. Dans une classe de caractères, les points d'interrogation sont pris au pied de la lettre, ce qui correspond à un ou plusieurs chiffres, virgules, points d'interrogation ou caractères d'espacement. –

1

Je voudrais split et scan en deux étapes.

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]] 

Notez que

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