1_2_3,,4__5,_6
需要解析为
1
2
3
_
4
5
6
我使用
std::vector<std::string> splitVec;
boost::char_separator<char> sep(" ,", "", keep_empty_tokens);
boost::tokenizer< boost::char_separator<char> > tokens(strText, sep);
boost::tokenizer< boost::char_separator<char> >::iterator tok_iter;
for( tok_iter = tokens.begin(); tok_iter != tokens.end(); ++tok_iter)
{
splitVec.push_back(*tok_iter);
}
结果解析结果不对
因为4和5之间的两个空格被解析时加了一个空字符串
但是如果写成
std::vector<std::string> splitVec;
boost::char_separator<char> sep(" ,", "", drop_empty_tokens);
boost::tokenizer< boost::char_separator<char> > tokens(strText, sep);
boost::tokenizer< boost::char_separator<char> >::iterator tok_iter;
for( tok_iter = tokens.begin(); tok_iter != tokens.end(); ++tok_iter)
{
splitVec.push_back(*tok_iter);
}
那么3和4之间两个逗号应该插入空字符串,结果没有插入,也会解析错误...
请问我该怎么办?
PS:
1,请不要回答把string变成char数组自己写解析代码...如果有库函数不用的话,那么stl,boost等那么多第三方库要着干嘛,都自己写库得了...当然如果各位都没什么好办法的话,我也只能自己写解析了
2,请回答详细一点,我很笨
3,数据来源就是这样的,一个文本里面包含多个分隔符,我必须得解出来,而且连续的空格当成一个空格来解,连续的非空格我要在其中插入空字符,我规范不了用户的格式
14 个解决方案
#1
结贴,我自己琢磨出来了...
#2
给点分儿
#3
echo $str | sed -r 's/_/ /g;s/,,/ - /g;s/,//g;s/ +/ /g' | tr " " "\n"
#4
接分了
#5
好多问题自己想象就能解决的。
#6
提醒:解决string parse问题正则表达式不是万能的,而有限状态自动机是万能的。
《编译原理》词法分析 有限状态自动机
《编译原理》词法分析 有限状态自动机
#7
boost是什么空间啊?和std有什么关系吗?
#8
提醒:解决string parse问题正则表达式不是万能的,而有限状态自动机是万能的。
《编译原理》词法分析 有限状态自动机
《编译原理》词法分析 有限状态自动机
#9
我想你提醒我有限状态自动机,是因为我的第一条注释写的不要推荐自己解析吧?
我并没有贬低自己写解析代码的意思
我只是觉得有些人回答问题很不负责任...
我曾经问过一些其他的问题,他们的回答都是简单一句"这么简单的需求,用什么BOOST,自己解析"
我承认我水平不够,写不出来...
但是我受不了这种回答问题的态度
而且,有库函数不用的话,岂不是对不起自己?
库函数解决不了或者解决起来很绕口,我才会想到自己去解析.
#10
//有字符串
//1_22_333,,4444__55555,_666666
//需要解析为
//1
//22
//333
//_
//4444
//55555
//666666
#include <stdio.h>
char s[]="1_22_333,,4444__55555,_666666";
char c,*p,*p1;
int st;
void main() {
st=0;
p=s;
while (1) {
c=*p;
if (0==c) {
switch (st) {
case 1:printf("_\n"); break;
case 2:printf("%s\n",p1);break;
}
break;//
}
switch (st) {
case 0:
if ('_'==c) { st=0;}
else if (','==c) { st=1;}
else {p1=p; st=2;}
break;
case 1:
if ('_'==c) { st=1;}
else if (','==c) {printf("_\n"); st=1;}
else {p1=p; st=2;}
break;
case 2:
if ('_'==c) {*p=0;printf("%s\n",p1);*p=c;st=0;}
else if (','==c) {*p=0;printf("%s\n",p1);*p=c;st=1;}
else { st=2;}
break;
}
p++;
}
}
//1
//22
//333
//_
//4444
//55555
//666666
#11
#include<iostream>
#include <string>
#include <Windows.h>
using namespace std;
int main()
{
string str="1 2 3,,4 5, 6";
bool flg=false;
for (int i=0;i!=str.length();i++)
{
string str_1=str.substr(i,1);
char p=str[i];
if (p>'0' && p<'9')
{
cout<<p<<endl;
flg=false;
}
if (p==',' )
{
if(flg)
cout<<endl;
flg=true;
}
}
system("pause");
}
#include <string>
#include <Windows.h>
using namespace std;
int main()
{
string str="1 2 3,,4 5, 6";
bool flg=false;
for (int i=0;i!=str.length();i++)
{
string str_1=str.substr(i,1);
char p=str[i];
if (p>'0' && p<'9')
{
cout<<p<<endl;
flg=false;
}
if (p==',' )
{
if(flg)
cout<<endl;
flg=true;
}
}
system("pause");
}
#12
#include<iostream>
#include <string>
#include <Windows.h>
using namespace std;
int main()
{
string str="1 2 3,,4 5, 6";
bool flg=false;
for (int i=0;i!=str.length();i++)
{
string str_1=str.substr(i,1);
char p=str[i];
if (p>'0' && p<'9')
{
cout<<p<<endl;
flg=false;
}
if (p==',' )
{
if(flg)
cout<<endl;
flg=true;
}
}
system("pause");
}
#13
分!!!!接分!!!!!!!!!
#14
接分了!
#1
结贴,我自己琢磨出来了...
#2
给点分儿
#3
echo $str | sed -r 's/_/ /g;s/,,/ - /g;s/,//g;s/ +/ /g' | tr " " "\n"
#4
接分了
#5
好多问题自己想象就能解决的。
#6
提醒:解决string parse问题正则表达式不是万能的,而有限状态自动机是万能的。
《编译原理》词法分析 有限状态自动机
《编译原理》词法分析 有限状态自动机
#7
boost是什么空间啊?和std有什么关系吗?
#8
提醒:解决string parse问题正则表达式不是万能的,而有限状态自动机是万能的。
《编译原理》词法分析 有限状态自动机
《编译原理》词法分析 有限状态自动机
#9
我想你提醒我有限状态自动机,是因为我的第一条注释写的不要推荐自己解析吧?
我并没有贬低自己写解析代码的意思
我只是觉得有些人回答问题很不负责任...
我曾经问过一些其他的问题,他们的回答都是简单一句"这么简单的需求,用什么BOOST,自己解析"
我承认我水平不够,写不出来...
但是我受不了这种回答问题的态度
而且,有库函数不用的话,岂不是对不起自己?
库函数解决不了或者解决起来很绕口,我才会想到自己去解析.
#10
//有字符串
//1_22_333,,4444__55555,_666666
//需要解析为
//1
//22
//333
//_
//4444
//55555
//666666
#include <stdio.h>
char s[]="1_22_333,,4444__55555,_666666";
char c,*p,*p1;
int st;
void main() {
st=0;
p=s;
while (1) {
c=*p;
if (0==c) {
switch (st) {
case 1:printf("_\n"); break;
case 2:printf("%s\n",p1);break;
}
break;//
}
switch (st) {
case 0:
if ('_'==c) { st=0;}
else if (','==c) { st=1;}
else {p1=p; st=2;}
break;
case 1:
if ('_'==c) { st=1;}
else if (','==c) {printf("_\n"); st=1;}
else {p1=p; st=2;}
break;
case 2:
if ('_'==c) {*p=0;printf("%s\n",p1);*p=c;st=0;}
else if (','==c) {*p=0;printf("%s\n",p1);*p=c;st=1;}
else { st=2;}
break;
}
p++;
}
}
//1
//22
//333
//_
//4444
//55555
//666666
#11
#include<iostream>
#include <string>
#include <Windows.h>
using namespace std;
int main()
{
string str="1 2 3,,4 5, 6";
bool flg=false;
for (int i=0;i!=str.length();i++)
{
string str_1=str.substr(i,1);
char p=str[i];
if (p>'0' && p<'9')
{
cout<<p<<endl;
flg=false;
}
if (p==',' )
{
if(flg)
cout<<endl;
flg=true;
}
}
system("pause");
}
#include <string>
#include <Windows.h>
using namespace std;
int main()
{
string str="1 2 3,,4 5, 6";
bool flg=false;
for (int i=0;i!=str.length();i++)
{
string str_1=str.substr(i,1);
char p=str[i];
if (p>'0' && p<'9')
{
cout<<p<<endl;
flg=false;
}
if (p==',' )
{
if(flg)
cout<<endl;
flg=true;
}
}
system("pause");
}
#12
#include<iostream>
#include <string>
#include <Windows.h>
using namespace std;
int main()
{
string str="1 2 3,,4 5, 6";
bool flg=false;
for (int i=0;i!=str.length();i++)
{
string str_1=str.substr(i,1);
char p=str[i];
if (p>'0' && p<'9')
{
cout<<p<<endl;
flg=false;
}
if (p==',' )
{
if(flg)
cout<<endl;
flg=true;
}
}
system("pause");
}
#13
分!!!!接分!!!!!!!!!
#14
接分了!