2015-10-18 68 views
0

在Ruby中, 我有一個字符串是這樣的:在Ruby中,得到基於字符串匹配的子

"name":"jucy","id":123,"property":"abc" 

我想從id獲得「123」。 獲取它的簡單方法是什麼? 我不想創建JSON並解析它,它可能是一種方式,但對於這種情況太多了。

回答

3

加載JSON解析器並解析它。

是的,你認爲這將是太多的工作。事實並非如此。爲什麼? An extensive JSON library comes with Ruby。該庫可能已經加載。它非常易於使用。速度非常快。它非常靈活,您將擁有整個數據結構。

而且,最重要的是,爲平衡分隔符(即引號)編寫自己的解析器可能需要很多工作才能獲得正確或太簡單,並且會錯過大量空間或轉義等邊緣案例。 This answerthis answer就是很好的例子。

唯一的警告是你的字符串不是很有效的JSON,它需要它周圍的散列分隔符。

require 'json' 

almost_json = '"name":"jucy","id":123,"property":"abc"' 

my_hash = JSON.parse('{' + almost_json + '}') 
puts my_hash["id"] 
0
'"name":"jucy","id":123,"property":"abc"'[/"id":(\d+),/, 1].to_i 
+0

' 「鍵\」 ID 「:234'或'」 身份證「:345'。 – Schwern

+0

爲什麼這是投票? – zee

+1

@NullSoulException因爲它除了用戶發佈的特定字符串外無效。我之前的評論是兩個例子,它不起作用,沒有考慮到逃跑並且沒有考慮到空白(哦,想到另一個:'「id」:123,')。最後,Ruby有一個易於使用的JSON解析器,我相信OP沒有意識到,他們假設將其解析爲JSON是很難的,因此將它們分解爲一個半破解的正則表達式是不負責任的。 – Schwern

0

以下是將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" 
+1

這些都有問題。其中一些記住佔空白,其中一些沒有。刪除引號意味着你不能區分'「id」:123'和'「some_id」:123'。他們都假設ID將是一個整數,甚至假定它將是三個字符。 – Schwern

+0

@Schwerm,好點。謝謝。考慮到這個例子,我認爲假設id是一個非負整數是合理的,但是如果不是的話,所需的改變是直截了當的。我做了一些改變。 –

+0

爲什麼要做這樣的關於ID的假設?也許它將來會成爲UUID,我已經這樣做了。有些仍然容易受到微小的空白變化的影響。他們都容易受到諸如''foo \「id」'(我承認這不太可能,但爲什麼會冒險呢?)這樣的引號逃脫。如果在它之前有一個鍵或值包含號碼 – Schwern

相關問題