#java #regex #square-bracket #braces
Вопрос:
В настоящее время я работаю над функцией импорта в проекте Java и получаю объекты в виде строки. Здесь используется структура, аналогичная JSON. Объекты заключены в фигурные скобки, а списки заключены в квадратные скобки.
Теперь у меня есть объект, который немного сложнее, потому что он состоит из списков объектов, которые сами по себе содержат списки большего количества (других) объектов. Я знаю, как получить внутренние объекты, но у меня возникают трудности с разделением внешних. Я чувствую, что упускаю из виду что-то довольно простое, но все скобки и скобки не делают это проще.
Вот пример того, как может выглядеть строка импорта (я оставил внутренние объекты объединенными для удобства чтения):
[
{
[
{[oid1,oid2],VAL,id1},{[oid2],VAL,id2},
{[oid2,oid3,oid4],VAL,id3}
]
},
{
[
{[oid5,oid6],VAL,id1},
{[oid7,oid8],VAL,id3}
]
}
]
До сих пор у меня есть это регулярное {[([^]{] )],([A-Z_] ),([^}] )}
выражение, которое совпадает со всеми внутренними объектами и возвращает их три компонента в виде групп.
Вот так:
Match 1: {[oid1,oid2],VAL,id1}
Group 1: oid1,oid2
Group 2: VAL
Group 3: id1
Это уже нормально, но просто возвращает список всех внутренних объектов. Теперь мне нужно найти способ получить список внешних объектов в паре со списком только тех внутренних объектов, которые они содержат. Я должен добавить, что мне не обязательно делать это за один шаг. Я попытался разделить начальную строку, но не смог придумать решение, которое бы не «вырезало» из нее слишком много, что нарушает разбор результирующих строк. Любая помощь будет очень признательна!
Комментарии:
1. Что же такое внешние объекты? Является
[ {{[oid1,oid2],VAL,id1},{[oid2],VAL,id2}, {[oid2,oid3,oid4],VAL,id3} ]
ли одним из таких?2. @Scratte Да и нет 🙂 Это один целостный объект, включая его внутренние объекты. Внешняя часть действительно является пустой оболочкой, в некотором роде.
Ответ №1:
Это то разделение, которое вы ищете, прежде чем добавлять регулярное выражение для своего внутреннего объекта?
Используемое регулярное выражение:
"]\s },\s \{\s \["
Регулярное выражение в контексте и верстаке:
public static void main(String[] args) {
String input = "[n"
" {n"
" [n"
" {[oid1,oid2],VAL,id1},{[oid2],VAL,id2},n"
" {[oid2,oid3,oid4],VAL,id3}n"
" ]n"
" },n"
" {n"
" [n"
" {[oid5,oid6],VAL,id1},n"
" {[oid7,oid8],VAL,id3}n"
" ]n"
" }n"
"]";
List<String> resultList = Arrays.asList(input.split("]\s },\s \{\s \["));
resultList.forEach(s -> System.out.printf("%s%n === %n", s));
}
Выход:
[
{
[
{[oid1,oid2],VAL,id1},{[oid2],VAL,id2},
{[oid2,oid3,oid4],VAL,id3}
===
{[oid5,oid6],VAL,id1},
{[oid7,oid8],VAL,id3}
]
}
]
Комментарии:
1. Именно так я и решил эту проблему. Работает также более чем для двух записей. Как вы и предлагали, я сначала разделил входные данные, а затем применил свое регулярное выражение для внутренних объектов.