0 - если это надежно, то есть делает то, что они говорят.
Давайте немного разберем выражение:
(,)
является группой захвата, которая соответствует одной запятой (?=...)
будет означать положительный прогноз, означающий, что после запятой должно следовать совпадение содержимого этой группы (?:...)*
будетгруппа без захвата, которая может встречаться от 0 до много раз [^"]|"[^"]*"
будет соответствовать любому символу, кроме двойной кавычки ([^"]
) или (|
) пары двойных кавычек с любым символом междукроме других двойных кавычек ("[^"]*"
)
Как видно, последняя часть может сделать ее ненадежной, если в текстовом значении есть экранированные двойные кавычки, поэтому ответ будет "это надежно"если ввод достаточно прост ".
1 - если это работает и с запятыми внутри двойных кавычек.
Если пары двойных кавычек правильно идентифицируют любые запятыемежду будет игнорироваться.
2 - если это учитывает экранированные двойные кавычки.
Вот одна из главных проблем: экранированные двойные кавычки должны быть обработаны. Это может быть довольно сложно, если вы хотите обрабатывать произвольные случаи, особенно если тексты также могут содержать запятые.
3 - если я должен учитывать также одинарные кавычки, так как этот файл создаетсямоим приложением, но иногда оно может быть отредактировано пользователем вручную.
Одиночные кавычки не допускаются в JSON-разделении, но многие парсеры их поддерживают, потому что люди все равно их используют. Таким образом, вам может потребоваться принять их во внимание, и это делает нет. 2 еще более сложный, потому что теперь может быть двойная кавычка без экранирования в тексте одной кавычки.
5 - Он должен использоваться с многострочным флагом для работы с многострочным текстом.
Я не совсем уверен в этом, но добавляюМногострочный флаг не должен повредить. Вы можете добавить его к самому выражению, то есть, предварительно подготовив (?m)
.
6 - он должен работать с replaceAll ().
в его текущей формеРегулярное выражение будет работать с String#replaceAll()
, потому что оно соответствует только запятой - предварительный просмотр используется для определения соответствия, но не приводит к замене неправильных частей. Сами совпадения могут быть некорректными, как описано выше.
При этом следует учитывать, что JSON не является обычным языком и только обычные языки идеально подходит для регулярных выражений.
Таким образом, я бы рекомендовал использовать правильный анализатор JSON (их довольно много) для анализа JSON в POJO (возможно, это просто набор общих экземпляров JsonObject и JsonArray). ) и переформатируйте его в соответствии с вашими потребностями.
Вот пример того, как Джексон может быть использован для достижения этой цели: https://kodejava.org/how-to-pretty-print-json-string-using-jackson/
На самом деле, поскольку вы уже используете JSONObject.toString()
, вам, вероятно, сам парсер не нужен, нопросто правильный форматтер (если вы хотите / хотите свернуть свой собственный, вы можете взглянуть на org.json.JSONObject
sources ).