我需要一个捕获组,它会在大括号之间返回inner1:
和inner2:
,但outter:
。
outter: value
{ inner1: value, inner2: value, ... }
我尝试了这个; \{.*?(\w*\:).*\}
我只获得了第一个inner1:
。我应该使用什么样的模式才能在花括号之间返回其余的组?
答案 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*([^:]++)/)