2015-04-01 86 views
1

我有格式如下永久的方式的字符串:C++的regexp到解析嵌套結構

{ 
    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 2015-04-01 17:58:55

回答

2

來自C++標準庫的正則表達式實現不支持遞歸,這將需要匹配嵌套結構。

就像Wintermute在評論中說的,像這樣的嵌套結構不是常規語言,而且你需要其他工具。

僅供參考,您可以使用Boost.RegexPCRE匹配以下模式:

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

Demo

這是一個非常簡單的遞歸模式。幾點說明:

  • [^{}]++匹配任何不是{}佔有性
  • (?R)遞歸整個圖案
  • *量詞施加在所述內所有格++量詞,其防止catastrophic backtracking

事情是,這隻會幫助匹配正確嵌套的結構。 解析不會真正幫助你。正則表達式對於這樣的工作並不是真正的工具,解析器會更合適。

如果你仍然想要去正則表達式的方式,你必須擴大模式,以更精確地匹配結構。如果使用PCRE,則可能需要使用標註機制從模式中提取信息,而引擎正在執行匹配。但就像我說的,只需編寫一個解析器。