2012-05-23 1 views
0

У меня есть строка, как это в РубинеКак извлечь GUID и значение из строки в рубине

word=0 id=891efc9a-2210-4beb-a19a-5e86b2f8a49f 

Как я могу получить как слово и значение идентификаторов из этой строки?

+0

Почему этот вопрос downvoted? – Martin

+2

Я не спустил вниз, но вы должны, как правило, опубликовать код, который вы уже пробовали в своем вопросе (и который не подходит по какой-то определенной причине). В противном случае вы оторветесь, попросите других людей сделать вашу работу за вас, без каких-либо усилий с вашей стороны. – maerics

ответ

2

Вот такой подход, который будет работать - разделить целевую строку на лексемы пробелами и равно-знак символы (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" 

Конечно, он сломается, если ваши «ключи» или «значение» содержат одинаковые знаки или пробела, но это работает для вашего примера.

1

Это должно помочь!

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 
+0

Я обновил это, чтобы создать хэш, который чувствует себя немного более удобным. –

1
string="word=0 id=891efc9a-2210-4beb-a19a-5e86b2f8a49f" 

word,id = string.match(/word=(.*) id=(.*)/).captures 
0

Я хотел бы использовать что-то простое, как:

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"] 
Смежные вопросы