Регулярное выражение для разделения текста JSON на строки после символов - PullRequest
0 голосов
/ 23 октября 2019

Я пытаюсь использовать регулярное выражение, чтобы получить такую ​​строку

{
 "key1"
:
value1
,
"key2"
:
"value2"
,
"arrayKey"
:
[
{
"keyA"
:
valueA
,
"keyB"
:
"valueB"
,
"keyC"
:
[
0
,
1
,
2
]
}
]
}

из

JSONObject.toString()

, которая является одной длинной строкой текста в моем приложении Java для Android

{"key1":"value1","key2":"value2","arrayKey":[{"keyA":"valueA","keyB":"valueB","keyC":[0,1,2]}]}

Я нашел это регулярное выражение для поиска всех запятых.

/(,)(?=(?:[^"]|"[^"]*")*$)/

Теперь мне нужно знать:

0 - если это надежно, то есть делает то, что говорят.

1 - если это работает также сзапятые внутри двойных кавычек.

2 - если это учитывает экранированные двойные кавычки.

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

5- Он должен использоваться с многострочным флагом для работы с многострочным текстом.

6- Требуетсяработать с replaceAll ().

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

Полученный текст должен быть все еще текстом JSON.

Последующие действия по замене будут выполняться также для других символов

: [ ] { } 

и других символов, которые можно найти вФайлы JSON вне буквенно-цифровых последовательностей между кавычками (я не знаю, являются ли упомянутые символы единственными).

Ответы [ 2 ]

0 голосов
/ 23 октября 2019

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 ).

0 голосов
/ 23 октября 2019

Это не так просто, но да, если вы хотите это сделать, вам нужно отфильтровать символы ([, {, ", ', :) и заменить вместо них символ новой строки, например:

[ should get replaced with [\n

Ответ на ваш вопрос: да, он очень надежен и хорош в реализации всего лишь одной строки кода и делает все. Вот для чего сделано регулярное выражение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...