在ruby中,根据子串匹配获取子字符串

时间:2015-10-18 22:10:48

标签: ruby string

在Ruby中, 我有一个这样的字符串:

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

我想得到' 123'来自id。 获得它的简单方法是什么? 我不想创建JSON并解析它,这可能是一种方式,但对于这种情况来说太多了。

3 个答案:

答案 0 :(得分: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"]

答案 1 :(得分:0)

'"name":"jucy","id":123,"property":"abc"'[/"id":(\d+),/, 1].to_i

答案 2 :(得分: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"