Проблемы с не жадным регулярным выражением C ++

Я хочу разобрать следующий код 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);

Но он все еще жадный: он соответствует всему тексту.

1

Решение

Вы делаете свои группы захвата необязательными, помещая ? вне их. Вместо этого поместите их в группы (.*?) для не жадного совпадения для первых двух группировок и обратитесь к группе захвата #2 для результата матча.

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

Live Demo

3

Другие решения

Вы можете использовать lookahead и lookbehind, чтобы соответствовать всем символам, которые присутствуют внутри {} фигурные скобки, только если за закрывающей фигурной скобкой следует ; и любой персонаж,

(?<=\\{)(.*?)(?=\\};.)

DEMO

1

Это то же самое, что и @ 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)
0
По вопросам рекламы [email protected]