У меня есть строка, как это в РубинеКак извлечь GUID и значение из строки в рубине
word=0 id=891efc9a-2210-4beb-a19a-5e86b2f8a49f
Как я могу получить как слово и значение идентификаторов из этой строки?
У меня есть строка, как это в РубинеКак извлечь GUID и значение из строки в рубине
word=0 id=891efc9a-2210-4beb-a19a-5e86b2f8a49f
Как я могу получить как слово и значение идентификаторов из этой строки?
Вот такой подход, который будет работать - разделить целевую строку на лексемы пробелами и равно-знак символы (tokens=str.split(/[= ]/)
) и создать хэш из них (Hash[*tokens]
). result is a Hash
, ключи которого маркер перед знаком равенства и значения являются те после этого:
s = 'word=0 id=891efc9a-2210-4beb-a19a-5e86b2f8a49f'
h = Hash[*s.split(/[= ]/)]
h # => {"word"=>"0", "id"=>"891efc9a-2210-4beb-a19a-5e86b2f8a49f"}
h['word'] # => "0"
h['id'] # => "891efc9a-2210-4beb-a19a-5e86b2f8a49f"
Конечно, он сломается, если ваши «ключи» или «значение» содержат одинаковые знаки или пробела, но это работает для вашего примера.
Это должно помочь!
s = "word=0 id=891efc9a-2210-4beb-a19a-5e86b2f8a49f"
data = {}
s.scan(/(\w+)(?=\=)\=([^\s]+)/).each do |pair|
key, value = pair
data[key.to_sym] = value
end
puts data.inspect
#=> {"word"=>"0", "id"=>"891efc9a-2210-4beb-a19a-5e86b2f8a49f"}
puts data[:word]
#=> 0
puts data[:id]
#=> 891efc9a-2210-4beb-a19a-5e86b2f8a49f
Я обновил это, чтобы создать хэш, который чувствует себя немного более удобным. –
string="word=0 id=891efc9a-2210-4beb-a19a-5e86b2f8a49f"
word,id = string.match(/word=(.*) id=(.*)/).captures
Я хотел бы использовать что-то простое, как:
str = 'word=0 id=891efc9a-2210-4beb-a19a-5e86b2f8a49f'
word, id = str.scan(/=(\S+)/).flatten # => ["0", "891efc9a-2210-4beb-a19a-5e86b2f8a49f"]
Каждый из значений, которые предшествуют =
так, что использовать в качестве места держатель для значения. Использование захвата (...)
в регулярном выражении говорит scan
создать новый подраздел массив, так flatten
будет способствовать подмассивам обратно к стандартным элементам массива:
'foo'.scan(/(o)/) # => [["o"], ["o"]]
'foo'.scan(/(o)/).flatten # => ["o", "o"]
Почему этот вопрос downvoted? – Martin
Я не спустил вниз, но вы должны, как правило, опубликовать код, который вы уже пробовали в своем вопросе (и который не подходит по какой-то определенной причине). В противном случае вы оторветесь, попросите других людей сделать вашу работу за вас, без каких-либо усилий с вашей стороны. – maerics