在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