忽略字符串末尾的正则表达式

时间:2017-11-28 14:23:50

标签: ruby regex

我有一个无效的JSON响应:

{"a": 1, "b": {...}}{"x": 2, "y": 3}

我无法修复源代码,所以我必须修复它。

我想只提取这个JSON块:{"a": 1, "b": {...}}

这是因为它附加了我想忽略的第二块元数据JSON {"x": 2, "y": 3}

如何将正则表达式格式化为

a)只接受第一个JSON blob(直到最后一个{之前的空格)

b)删除最后一个JSON块(我会说找出字符串中的最后一个{,这样我就可以在它之前拆分。

方法B可能最简单

2 个答案:

答案 0 :(得分:2)

就我现在的想法而言,你在JSON的一个小括号旁边永远不会有一个开放的括号,所以你可以通过一个简单的分割来逃脱:

source = '{"a": 1, "b": {"c": 2}}{"x": 2, "y": 3}'
json = source.split(/(?<=\})\s*\{/)[0]
JSON.parse(json)
# => {"a"=>1, "b"=>{"c"=>2}}

答案 1 :(得分:1)

你可以使用正则表达式,但只需拉出你想要的字符串就可以了。

str = '{"a": 1, "b": {"c": 2}}{"x": 2, "y": 3}'

s = str[0, str.index('}{')]
  #=> "{\"a\": 1, \"b\": {\"c\": 2}"

puts s
  #=> {"a": 1, "b": {"c": 2}

在这里,我假设,在示例中,'}{'中的大括号之间没有空格。如果可能有零个或多个空格,如下所示:

str = '{"a": 1, "b": {"c": 2}}   {"x": 2, "y": 3}'

使用以下(唉,使用正则表达式,尽管是一个简单的正则表达式):

puts str[0, str.index(/\} *\{/)]
  #=> {"a": 1, "b": {"c": 2}