Java正则表达式匹配花括号 - “无效的转义序列”

时间:2012-10-11 16:43:40

标签: java regex

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

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

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

我做错了什么?

5 个答案:

答案 0 :(得分:13)

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

  1. 如果你想逃避他们,你可以。反斜杠是regexp的转义符号,但它也应该通过第二反斜杠转义为Java本身。

  2. 为什么不逃避分组构造中的curle大括号?

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

  4. 您使用的是不情愿的量词,因此无法使用嵌套大括号,例如{"a", {"b", "c"}, "d"}它将匹配{"a", {"b", "c"}

答案 1 :(得分:12)

关于Java正则表达式的一个令人讨厌的事情是java不能将正则表达式识别为正则表达式。
它仅接受\\\'\"\u[hexadecimal number]作为有效转义序列。 因此,你必须逃避反斜杠,因为\{显然是一个无效的转义序列 更正版本:

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

答案 2 :(得分:3)

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

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

有关转义序列的详细信息,请参阅Pattern documentation

答案 3 :(得分:2)

加倍反斜杠:

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

答案 4 :(得分:2)

正则表达式应为

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

.不是必需的!