捕获花括号内的组

时间:2014-01-24 14:20:02

标签: regex

我需要一个捕获组,它会在大括号之间返回inner1:inner2:,但outter:

outter: value
{ inner1: value, inner2: value, ... }

我尝试了这个; \{.*?(\w*\:).*\}我只获得了第一个inner1:。我应该使用什么样的模式才能在花括号之间返回其余的组?

3 个答案:

答案 0 :(得分:1)

这看起来像JSON语法。为什么不将它序列化为JSON对象或字典并根据键提取?

答案 1 :(得分:1)

这似乎捕获了inner1:inner2:

^\{\s*(?:(\w+:)\s*\w+\s*,?\s*)+\s*\}$

编辑:略有改动,它显示它在我使用expresso进行测试时捕获值。

答案 2 :(得分:0)

如果你的数据是格式良好的json,你可以使用json解析器。

另一种方法是使用简单模式提取大括号{([^}]++)}内的所有内容并分割结果。

一种完整的正则表达方式:(使用未定义数量的键/值)

(?>{|\G(?<!\A):[^,}]++,)\s*([^:]++)

结果在捕获组1中

模式细节:

(?>            # atomic group: all that can be before the key
    {          # literal: {
  |            # OR
    \G(?<!\A)  # contiguous to a precedent match but not a the start of the string 
    :[^,}]++,  # a : followed by all that is not a , or } followed by a ,
)              # close the atomic group
\s*            # possible spaces
([^:]++)       # capture group 1: all that is not a :

示例:

text = <<EOF
outter: value
{ inner1: value, inner2: value, inner3: val }
EOF

puts text.scan(/(?>{|\G(?<!\A):[^,}]++,)\s*([^:]++)/)