2015-10-18 64 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

相关问题