在侧面花括号中获取字符串,其中的花括号中也包含更多值

时间:2015-09-30 19:36:48

标签: java regex string

所以这是我的(java)字符串

String s = "Some string preceding this {\"Key1\": \"Val1\", \"Key2\": {\"embedKey1\": \"embedVal1\", \"embedKey2\": \"embedVal2\"}, \"Key3\" : \"Val3\", \"Key3\": \"Val4\"}, some value proceeding it"

我希望获得外部花括号内的所有内容。我怎么做?到目前为止,我已经尝试了以下

    Pattern p = Pattern.compile("\\{([^}]*)\\}");
    Matcher m = p.matcher(s);
    while(m.find()){
       System.out.println(m.group(1));
    }

然而,这仅打印

"Key1": "Val1", "Key2": {"embedKey1": "embedVal1", "embedKey2": "embedVal2"

有人可以帮帮我吗?

3 个答案:

答案 0 :(得分:2)

要获取外部大括号之间的所有内容,或者在第一个{和最后一个} 之间,请使用与匹配所有符号的.进行贪婪匹配(使用 DOTALL 模式):

String s = "Some string preceding this {\"Key1\": \"Val1\", \"Key2\": {\"embedKey1\": \"embedVal1\", \"embedKey2\": \"embedVal2\"}, \"Key3\" : \"Val3\", \"Key3\": \"Val4\"}, some value proceeding it";
Pattern p = Pattern.compile("(?s)\\{(.*)}");
Matcher m = p.matcher(s);
while(m.find()){
    System.out.println(m.group(1));
}

请参阅IDEONE demo

(?s)Pattern.DOTALL修饰符的内联版本。

答案 1 :(得分:0)

对于您的特定示例,您可以使用这样的正则表达式:

\{(.*?)\{.*?}(.*?)}

<强> Working demo

匹配信息

MATCH 1
1.  [40-64] `"Key1": "Val1", "Key2": `
2.  [116-149]   `, "Key3" : "Val3", "Key3": "Val4"`

另一方面,如果您想要捕捉内部花括号,您可以使用更简单的东西:

\{(.*)}

<强> Working demo

匹配信息

MATCH 1
1.  [40-149]    `"Key1": "Val1", "Key2": {"embedKey1": "embedVal1", "embedKey2": "embedVal2"}, "Key3" : "Val3", "Key3": "Val4"`
QUICK REFERENCE

请记住在java中转义反斜杠:

Pattern p = Pattern.compile("\\{(.*)}");
Matcher m = p.matcher(s);
while(m.find()){
   System.out.println(m.group(1));
}

答案 2 :(得分:0)

如果它只是在最外层&#34; {&#34;和&#34;}&#34;正如您在问题中提到的,这可能是非正则表达式之一。

    int first=s.indexOf('{');
    int last=s.lastIndexOf('}');

    String result=s.substring(first, last+1);