2016-09-16 2 views
-3

В настоящее время я работаю над парсером для своей программы. Парсер разбирает код, похожий на JSON, но я хочу держаться подальше от использования парсера JSON. Крайне важно, чтобы я использовал свой собственный парсер, а не сторонний парсер. Он использует фигурные скобки для установки «наборов».Regex для получения текста между фигурными скобками

Это мой текущий код регулярного выражения на данный момент.

\\{(\\s*)+(.*?)(\\s*)+\\}

Пример ввода и вывода будет:

Вход: {value, value2}

Выход: value, value2

Теперь, это работает отлично, но когда я хочу поставить еще один набор в вход:

Вход: {value, {value2}}

Выход: value, {value2 }<-Outermost curly bracket

Наружная фигурная скобка остаются позади, поскольку закрывающая скобка из встроенного набора становится частью рисунка.

Я также хочу, чтобы иметь возможность поставить другие наборы на входе:

Вход: {value, value2} {value3, value4}

(Wanted) Выход: value, value2 value3, value4

Это делает с помощью $ в конце регулярного выражения практически бесполезный.

+0

Это '{(\ s *) + (. *?) (\ S *) +}' - это плохой способ сделать это. Если флаг «точка-все» установлен, '\ s' является избыточным. Если флаг dot-all установлен _NOT_, этот '. *?' Будет разрешать только одну строку, прежде чем он ожидает опциональные пробелы, а затем '}'. Вид поражения цели, если вы только пытаетесь сопоставить 1 строку. – sln

+0

Regex в Java не поддерживает рекурсию, поэтому вы не можете использовать ее для анализа вложенных структур. – Pshemo

+1

Используйте собственные рекурсивные вызовы функций языка Java, поддерживайте собственный подсчет брекетов. Regex в Java не может быть и речи. Запросите обновление. – sln

ответ

0

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

вход будет что-то вроде:

"@set1{ value1, value2, @set2{ value3, value4}, @set3{ value5, value6}, value7} @set4{ value8, value9 }"

Так что было бы эквивалентно этой схеме:

  • Set 1
    • Значение 1
    • Значение 2
    • Набор 2
      • Значение 3
      • Значение 4
    • Набор 3
      • Значение 5
      • Значение 6
    • Значение 7
  • Set 4
    • Значения 8
    • Значение 9

То, что я рядом был перебирать каждый символ в строке, и подсчитывал количество открытых скобок. Затем я убедился, что количество закрытых скобок было равно одному set.

Я использовал рекурсивный метод для получения вложенных множеств.

Смежные вопросы