Регулярное выражение для анализа строки с несколькими скобками (и скобками)

#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. Именно так я и решил эту проблему. Работает также более чем для двух записей. Как вы и предлагали, я сначала разделил входные данные, а затем применил свое регулярное выражение для внутренних объектов.