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

use*_*111 14 java regex

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

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

String[] strArr = jsonText.split("\{([^}]*.?)\}");
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Suz*_*ioc 14

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

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

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

  3. 有很好的JSON解析库/sf/ask/23701051/

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

  • 只是一点点评论:花括号实际上对正则表达式引擎有特殊意义(例如A和AA的A {1,2}).未转义,它们可能会导致奇怪的错误,而`Pattern.compile(...)`. (5认同)
  • **花括号在正则表达式中有意义**,它们可以用来说**重复可以发生多少次**.例如.[AZ] {1,4}表示大写字母将发生在1到4次之间. (3认同)

116*_*684 12

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

String[] strArr = jsonText.split("\\{([^}]*.?)\\}");
Run Code Online (Sandbox Code Playgroud)