Java regex для соответствия фигурным скобкам - "недействительная escape-последовательность"

Я хочу проанализировать вложенные строки JSON, разбив их рекурсивно на {}. Регулярное выражение, которое я придумал, это "{([^}] *.?)}", Который я тестировал, соответственно захватывает строку я хотеть. Однако, когда я пытаюсь включить его в свою Java, я получаю следующую ошибку: "Неверная escape-последовательность (допустимые:\b\t\n\f\r \" \'\) "

Это мой код и где возникает ошибка:

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

Что я делаю неправильно?

Ответ 1

1. Скобки не имеют особого значения здесь для языка регулярных выражений, поэтому они не должны избегать, я думаю.

  1. Если вы хотите избежать их, вы можете. Обратная косая черта - это escape-символ для regexp, но он также должен быть экранирован для самой Java со вторым обратным слэшем.

  2. Почему вы не избегаете скотча внутри фигуры группировки?

  3. Есть хорошие библиотеки разбора JSON https://stackoverflow.com/questions/338586/a-better-java-json-library

  4. Вы используете квантификатор неохотного, поэтому он не будет работать с вложенными скобками, например, для {"a", {"b", "c"}, "d"} он будет соответствовать {"a", {"b", "c"}

Ответ 2

Отвратительная вещь о регулярных выражениях Java заключается в том, что java не распознает регулярное выражение как регулярное выражение.
Он принимает только \\, \', \" или \u[hexadecimal number] как допустимые escape-последовательности. Вам, таким образом, придется избегать обратных косых черт, потому что, очевидно, \{ является недопустимой escape-последовательностью.
Исправленная версия:

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

Ответ 3

Вам нужно избегать обратной косой черты с еще одной обратной косой чертой. Поскольку \{ не является допустимой escape-последовательностью: -

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

Вы можете обратиться к документации по шаблонам для получения дополнительной информации об escape-последовательностях.

Ответ 4

Двойная обратная косая черта:

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

Ответ 5

Регулярное выражение должно быть

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

. не требуется!