#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