在Ruby中, 我有一個字符串是這樣的:在Ruby中,得到基於字符串匹配的子
"name":"jucy","id":123,"property":"abc"
我想從id
獲得「123」。 獲取它的簡單方法是什麼? 我不想創建JSON並解析它,它可能是一種方式,但對於這種情況太多了。
在Ruby中, 我有一個字符串是這樣的:在Ruby中,得到基於字符串匹配的子
"name":"jucy","id":123,"property":"abc"
我想從id
獲得「123」。 獲取它的簡單方法是什麼? 我不想創建JSON並解析它,它可能是一種方式,但對於這種情況太多了。
加載JSON解析器並解析它。
是的,你認爲這將是太多的工作。事實並非如此。爲什麼? An extensive JSON library comes with Ruby。該庫可能已經加載。它非常易於使用。速度非常快。它非常靈活,您將擁有整個數據結構。
而且,最重要的是,爲平衡分隔符(即引號)編寫自己的解析器可能需要很多工作才能獲得正確或太簡單,並且會錯過大量空間或轉義等邊緣案例。 This answer和this answer就是很好的例子。
唯一的警告是你的字符串不是很有效的JSON,它需要它周圍的散列分隔符。
require 'json'
almost_json = '"name":"jucy","id":123,"property":"abc"'
my_hash = JSON.parse('{' + almost_json + '}')
puts my_hash["id"]
'"name":"jucy","id":123,"property":"abc"'[/"id":(\d+),/, 1].to_i
以下是將JSON字符串轉換爲哈希以外的幾種方法。
s = '"name":"jucy","id":123,"property":"abc"'
正則表達式與捕獲組
s[/\"id\":\s*(\d+)/,1] #=> "123"
正則表達式以積極的回顧後
s[/(?<=\"id\":)\d+/] #=> "123"
這需要的結腸和第一數位之間的空間的數量是固定的。我假設了零空間。
正則表達式與\K
(忘了到目前爲止的所有匹配)
s[/\"id\":\s*\K\d+/] #=> "123"
查找索引,其中,id:
開始,轉換爲整數,並返回一個字符串
s[s.index('"id":')+5..-1].to_i.to_s #=> "123"
查找數字...
...如果,在你的榜樣,子串由字符串中唯一的數字:
s[/\d+/] #=> "123"
這些都有問題。其中一些記住佔空白,其中一些沒有。刪除引號意味着你不能區分'「id」:123'和'「some_id」:123'。他們都假設ID將是一個整數,甚至假定它將是三個字符。 – Schwern
@Schwerm,好點。謝謝。考慮到這個例子,我認爲假設id是一個非負整數是合理的,但是如果不是的話,所需的改變是直截了當的。我做了一些改變。 –
爲什麼要做這樣的關於ID的假設?也許它將來會成爲UUID,我已經這樣做了。有些仍然容易受到微小的空白變化的影響。他們都容易受到諸如''foo \「id」'(我承認這不太可能,但爲什麼會冒險呢?)這樣的引號逃脫。如果在它之前有一個鍵或值包含號碼 – Schwern
' 「鍵\」 ID 「:234'或'」 身份證「:345'。 – Schwern
爲什麼這是投票? – zee
@NullSoulException因爲它除了用戶發佈的特定字符串外無效。我之前的評論是兩個例子,它不起作用,沒有考慮到逃跑並且沒有考慮到空白(哦,想到另一個:'「id」:123,')。最後,Ruby有一個易於使用的JSON解析器,我相信OP沒有意識到,他們假設將其解析爲JSON是很難的,因此將它們分解爲一個半破解的正則表達式是不負責任的。 – Schwern