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

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
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 » Wed Sep 08, 2010 9:40 am

строка

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 » Wed Sep 08, 2010 10:27 am

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

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

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 » Thu Sep 09, 2010 4:25 am

поля нужно сложить отдельно, а то что у них в скобочках отдельно. я начал разбирать токенайзом по закрывающимся скобкам, потом по открывающимся (да еще и запятую впереди надо удалять)
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 » Thu Sep 09, 2010 7:55 am

У меня возник вопрос как сделать так чтобы 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
Contact:

Post by midisa » Tue Sep 14, 2010 6:53 am

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

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 » Sat Aug 20, 2016 9:52 pm

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. Естественно разбор иерархических структур (вложенные конструкции со скобками) вам придется делать вручную или применять уже инструменты уровня парсер.

Post Reply