Простое регулярное выражение Ruby для строки JSON

#ruby #regex #json

#ruby #регулярное выражение #json

Вопрос:

У меня есть следующая простая строка JSON:

 {"exclude"=>[4, 5, 6, 10], "include"=>[]}
  

и я хотел бы извлечь каждое число из массива после «исключить». Другими словами, я ожидал бы, что моим 0-м совпадением будут все числа, моим первым совпадением будет 4, вторым 5 и так далее. Большое спасибо.

Комментарии:

1. Меня смущают две вещи: 1. Зачем вам сканировать JSON с помощью регулярного выражения, когда вся причина существования JSON заключается в том, что на каждом языке для него уже написаны парсеры? 2. Это не JSON, это почти Ruby, это похоже на вывод Kernel#p .

Ответ №1:

Возможно, не будет ни одного аккуратного регулярного выражения, на которое вы могли бы надеяться:

 s = '{"exclude"=>[4, 5, 6, 10], "include"=>[]}'

all_numbers = s[/[[d,s] ]/]
# => "[4, 5, 6, 10]"

all_numbers.scan(/d /).map { |m| m.to_i }
# => [4, 5, 6, 10]

# Depends how much you trust the regex that grabs the result for all_numbers.
eval(all_numbers)
# => [4, 5, 6, 10]

# As a one-liner.
s[/[[d,s] ]/].scan(/d /).map { |m| m.to_i } # => [4, 5, 6, 10]
  

Комментарии:

1. Рад помочь. Как уже говорили другие, загляните в анализатор JSON. Конечно, у вас могут быть некоторые соображения по производительности, о которых мы не знаем.

Ответ №2:

если бы мне действительно пришлось использовать здесь регулярные выражения, я бы сделал что-то вроде этого:

 string = "{"exclude"=>[4, 5, 6, 10], "include"=>[]}"

exclude, include = string.scan(/([[d,s]{0,}])/).map {|match| eval match.first}

exclude # => [4, 5, 6, 10]
include # => []
  

Ответ №3:

Как указывает DigitalRoss, ваша строка содержит не JSON, а, по-видимому, простой код Ruby.

Вы можете легко оценить его и получить к нему доступ простым:

 lStr = "{"exclude"=>[4, 5, 6, 10], "include"=>[]}"

# Evaluate the string: you get a map
lMap = eval(lStr)
# => {"exclude"=>[4, 5, 6, 10], "include"=>[]}

# Read the properties
lMap['exclude']
# => [4, 5, 6, 10]
lMap['include']
# => []
lMap['exclude'][2]
# => 6