помогите разобрать строку

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

помогите разобрать строку

Post by borr_1 »

строка

Code: Select all

поле1(key, hide, filtr, label), поле2(key, hide, filtr, label)
пробовал делать wxStringTokenizer tkz(str, wxT("),")); но вся проблема в том что между закрывающейся скобочкой и запятой может быть пробел или два. всю строку избавлять от пробелов нельзя. подскажите как поэлегантнее выкрутиться.
WinXP SP3, wx-2.8.10, MinGW-4.4.1, gdb-7.1.2, eclipse
Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Re: помогите разобрать строку

Post by Mojo »

borr_1 wrote:строка

Code: Select all

поле1(key, hide, filtr, label), поле2(key, hide, filtr, label)
пробовал делать wxStringTokenizer tkz(str, wxT("),")); но вся проблема в том что между закрывающейся скобочкой и запятой может быть пробел или два. всю строку избавлять от пробелов нельзя. подскажите как поэлегантнее выкрутиться.
Выкручиваться, по любому нужно через wxStringTokenizer... остальные способы будут "изобретением колеса", просто нужно как я понимаю, разобраться с пробелами...
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Re: помогите разобрать строку

Post by Mojo »

Думал, думал.... что нужно? разбить строку типа:

Code: Select all

поле1(key, 
hide,
filtr, 
label),
поле2(key, 
hide, 
filtr, 
label)
Или же разбить вообще все и вся? типа:

Code: Select all

поле1
(
key
, 
hide
,
filtr
, 
label
)
,
поле2
(
key
, 
hide
, 
filtr
, 
label
)
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Post by borr_1 »

поля нужно сложить отдельно, а то что у них в скобочках отдельно. я начал разбирать токенайзом по закрывающимся скобкам, потом по открывающимся (да еще и запятую впереди надо удалять)
WinXP SP3, wx-2.8.10, MinGW-4.4.1, gdb-7.1.2, eclipse
borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Post by borr_1 »

У меня возник вопрос как сделать так чтобы wxStringTokenizer считал за разделитель два знака а не по одному. Если у меня разделитель '==' т.е.
pole1==var1 мне надо чтобы вернулось pole1 var1,а возвращается еще и пустая строка между при этом в строке может быть просто (=) мне надо чтобы токенайзер вообще его не рассматривал как разделитель.
WinXP SP3, wx-2.8.10, MinGW-4.4.1, gdb-7.1.2, eclipse
midisa
Earned some good credits
Earned some good credits
Posts: 113
Joined: Tue Jun 22, 2010 4:15 pm

Post by midisa »

Не знаю в тему будет или нет. Под винду у меня была такая функция, которая помогала мне разбирать строки:

BOOL GetSeparateString(CString sInput, CString sSeparator, int nSection, CString *sReturn)
{
CString sOut;
int iStartFind = 0;
int iEndFind = 0;
for (int i = 1; i <= nSection; i++)
{
iStartFind = iEndFind;
iEndFind = sInput.Find(sSeparator,iStartFind + 1);
}

if (iEndFind == -1)
{
iEndFind = sInput.GetLength();
// return FALSE;
}

if (iStartFind == 0)
{
sOut.Format("%s",sInput.Mid(iStartFind,iEndFind - iStartFind));
}
else
{
sOut.Format("%s",sInput.Mid(iStartFind + sSeparator.GetLength(),iEndFind - iStartFind - sSeparator.GetLength()));
}

*sReturn = sOut;

return TRUE;
}
Не идеал, но работает в моих проектах.
Можно поменять CString на wxString и использовать.

Вызывать нужно так:
GetSeparateString(входная строка, разделитель например запятая, номер секции который хотите получить, строка куда будет передана часть полученной строки)

CString sReturn;
GetSeparateString("first,two,tree", ",", 2, &sReturn);

получим sReturn = "two"
rst256
In need of some credit
In need of some credit
Posts: 2
Joined: Sat Aug 20, 2016 8:36 pm

Re: помогите разобрать строку

Post by rst256 »

Mojo wrote:
borr_1 wrote:строка

Code: Select all

поле1(key, hide, filtr, label), поле2(key, hide, filtr, label)
пробовал делать wxStringTokenizer tkz(str, wxT("),")); но вся проблема в том что между закрывающейся скобочкой и запятой может быть пробел или два. всю строку избавлять от пробелов нельзя. подскажите как поэлегантнее выкрутиться.
Выкручиваться, по любому нужно через wxStringTokenizer... остальные способы будут "изобретением колеса", просто нужно как я понимаю, разобраться с пробелами...
Выкиньте этот wxStringTokenizer, если он не работает с регулярками! В wx есть вполне сносная поддержка регулярных выражений используйте ее для токенизации.
P.S. Естественно разбор иерархических структур (вложенные конструкции со скобками) вам придется делать вручную или применять уже инструменты уровня парсер.