20

我想通过 { } 递归地拆分嵌套的 JSON 字符串来解析它们。我想出的正则表达式是“{([^}]*.?)}”,我已经测试过它可以适当地抓取我想要的字符串。但是,当我尝试将它包含在我的 Java 中时,我收到以下错误:“无效的转义序列(有效的转义序列是 \b \t \n \f \r \" \' \ )”

这是我的代码,错误发生的地方:

String[] strArr = jsonText.split("\{([^}]*.?)\}");

我究竟做错了什么?

4

5 回答 5

19

Java 正则表达式的讨厌之处在于 java 不将正则表达式识别为正则表达式。
它只接受\\, \',\"\u[hexadecimal number]作为有效的转义序列。因此,您必须转义反斜杠,因为显然\{是无效的转义序列。
修正版:

String[] strArr = jsonText.split("\\{([^}]*.?)\\}");
于 2012-10-11T16:46:07.747 回答
18

1. 花括号在这里对于正则表达式语言没有特殊含义,所以我认为它们不应该被转义。

  1. 如果你想逃离他们,你可以。反斜杠是正则表达式的转义符号,但对于 Java 本身也应该使用第二个反斜杠进行转义。

  2. 有很好的 JSON 解析库https://stackoverflow.com/questions/338586/a-better-java-json-library

  3. 您正在使用不情愿的量词,因此它不适用于嵌套大括号,例如{"a", {"b", "c"}, "d"}它会匹配{"a", {"b", "c"}

于 2012-10-11T16:54:39.977 回答
4

你需要用一个反斜杠来转义你的反斜杠。因为,\{不是有效的转义序列:-

String[] strArr = jsonText.split("\\{([^\\}]*.?)\\}");

有关转义序列的更多信息,您可以参考Pattern 文档

于 2012-10-11T16:44:31.290 回答
4

正则表达式应该是

"\\{([^}]*?)\\}"

.不需要!

于 2012-10-11T16:50:15.577 回答
3

双反斜杠:

String[] strArr = jsonText.split("\\{([^}]*.?)\\}");
于 2012-10-11T16:47:54.873 回答