非贪婪的C ++正则表达式的麻烦

时间:2014-09-14 16:10:44

标签: c++ regex c++11 regex-greedy

我想解析以下Lua代码:

[1]={['x']=198;['y']=74;['width']=99;['height']=199;};[2]={['x']=82;['y']=116;['width']=82;['height']=164;};

请注意,表格中有两个键:[1][2]。我想只获取[1]键的值。我怎么做?我尝试了以下内容:

cmatch res;
regex rx("\\[(.*)?\\]=\\{(.*)?\\};(.*)");
regex_search(lua_table.c_str(), res, rx);

但它仍然贪婪:它匹配整个文本。

3 个答案:

答案 0 :(得分:3)

您可以将?置于其外部,从而使您的捕获组成为可选项。相反,将它们放在组(.*?)中以获得前两个分组的非贪婪匹配,并参考捕获组#2以获得匹配结果。

\\[(.*?)\\]=\\{(.*?)\\};(.*)

Live Demo

答案 1 :(得分:1)

只有在右括号后面跟{}和任何字符

时,才可以使用前瞻和后瞻来匹配;括号内的所有字符。
(?<=\\{)(.*?)(?=\\};.)

DEMO

答案 2 :(得分:0)

这与@ hwnd相同,有更详细的信息。

 # [1]={['x']=198;['y']=74;['width']=99;['height']=199;};[2]={['x']=82;['y']=116;['width']=82;['height']=164;};  
 #  **  Grp 0 -  ( pos 0 , len 108 ) 
 # [1]={['x']=198;['y']=74;['width']=99;['height']=199;};[2]={['x']=82;['y']=116;['width']=82;['height']=164;};  
 #  **  Grp 1 -  ( pos 1 , len 1 ) 
 # 1  
 #  **  Grp 2 -  ( pos 5 , len 47 ) 
 # ['x']=198;['y']=74;['width']=99;['height']=199;  
 #  **  Grp 3 -  ( pos 54 , len 54 ) 
 # [2]={['x']=82;['y']=116;['width']=82;['height']=164;};  

 # "\\[(.*?)\\]=\\{(.*?)\\};(.*)"

 \[
 ( .*? )                       # (1)
 \]
 =
 \{
 ( .*? )                       # (2)
 \}
 ;
 ( .* )                        # (3)