Page 1 of 1

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

Posted: Wed Sep 08, 2010 9:40 am
by borr_1
строка

Code: Select all

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

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

Posted: Wed Sep 08, 2010 10:27 am
by Mojo
borr_1 wrote:строка

Code: Select all

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

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

Posted: Wed Sep 08, 2010 1:56 pm
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
)

Posted: Thu Sep 09, 2010 4:25 am
by borr_1
поля нужно сложить отдельно, а то что у них в скобочках отдельно. я начал разбирать токенайзом по закрывающимся скобкам, потом по открывающимся (да еще и запятую впереди надо удалять)

Posted: Thu Sep 09, 2010 7:55 am
by borr_1
У меня возник вопрос как сделать так чтобы wxStringTokenizer считал за разделитель два знака а не по одному. Если у меня разделитель '==' т.е.
pole1==var1 мне надо чтобы вернулось pole1 var1,а возвращается еще и пустая строка между при этом в строке может быть просто (=) мне надо чтобы токенайзер вообще его не рассматривал как разделитель.

Posted: Tue Sep 14, 2010 6:53 am
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"

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

Posted: Sat Aug 20, 2016 9:52 pm
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. Естественно разбор иерархических структур (вложенные конструкции со скобками) вам придется делать вручную или применять уже инструменты уровня парсер.