Java regex для соответствия фигурным скобкам - "недействительная escape-последовательность"
Я хочу проанализировать вложенные строки JSON, разбив их рекурсивно на {}. Регулярное выражение, которое я придумал, это "{([^}] *.?)}", Который я тестировал, соответственно захватывает строку я хотеть. Однако, когда я пытаюсь включить его в свою Java, я получаю следующую ошибку: "Неверная escape-последовательность (допустимые:\b\t\n\f\r \" \'\) "
Это мой код и где возникает ошибка:
String[] strArr = jsonText.split("\{([^}]*.?)\}");
Что я делаю неправильно?
Ответы
Ответ 1
1. Скобки не имеют особого значения здесь для языка регулярных выражений, поэтому они не должны избегать, я думаю.
-
Если вы хотите избежать их, вы можете. Обратная косая черта - это escape-символ для regexp, но он также должен быть экранирован для самой Java со вторым обратным слэшем.
-
Почему вы не избегаете скотча внутри фигуры группировки?
-
Есть хорошие библиотеки разбора JSON https://stackoverflow.com/questions/338586/a-better-java-json-library
-
Вы используете квантификатор неохотного, поэтому он не будет работать с вложенными скобками, например, для {"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
Регулярное выражение должно быть
"\\{([^}]*?)\\}"
.
не требуется!