2015-04-01 3 views
1

У меня есть строка, отформатированная следующим образом: постоянногоC++ регулярного выражения для разбора вложенного-структуру

{ 
    First nested string; 
    { 
    Second nested string; 
    } 
} 

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

First nested string; 
{ 
    Second nested string; 
} 

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

regex regEx("\\s*\\{\\s*(.*?)\\s*\\}\\s*"); 
string testInput = 
"{\n" 
" First nested string;\n" 
" {\n" 
" Second nested string;\n" 
" }\n" 
"}\n"; 
smatch match; 
if (regex_search(testInput, match, regEx)) 
{ 
    auto result = match[1].str(); 
} 

Какое регулярное выражение сделает его таким, чтобы я мог получать вложенные данные? Спасибо заранее.

+0

Отсутствует. У вас там нет обычного языка, и хотя некоторые библиотеки регулярных выражений расширяют регулярные выражения в области контекстно-свободных языков, таких как эта, стандартная библиотека C++ не поддерживает рекурсию. Вы можете быть заинтересованы в [Boost.Spirit] (http://www.boost.org/doc/libs/1_57_0/libs/spirit/doc/html/index.html), чтобы проанализировать это. – Wintermute

ответ

2

Реализация регулярного выражения из стандартной библиотеки C++ не поддерживает рекурсию, которая необходима для соответствия вложенным структурам.

Как и Wintermute в комментариях, вложенные структуры, такие как это, не являются обычным языком, и вам нужны другие инструменты.

FYI, вы можете использовать Boost.Regex или PCRE, чтобы соответствовать следующей схеме:

\{(?:[^{}]++|(?R))*\} 

Demo

Это довольно простой рекурсивный шаблон. Некоторые пояснения:

  • [^{}]++ соответствует ничего, кроме { или }властно.
  • (?R) рекурсивен весь образец
  • * квантификатор наносится на внутренний притяжательной ++ квантификатора, что предотвращает catastrophic backtracking.

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

Если у вас есть еще, то хотите перейти по пути регулярного выражения, вам нужно будет расширить шаблон, чтобы он соответствовал конструкциям. Если вы используете PCRE, вы можете использовать механизм выноса для извлечения информации из рисунка , а двигатель выполняет матч. Но, как я уже сказал, просто напишите парсер.

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