字符串分割问题

时间:2023-01-07 11:45:14
有字符串
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


接分了
引用 1 楼 peach5460 的回复:
结贴,我自己琢磨出来了...

#5


好多问题自己想象就能解决的。

#6


提醒:解决string parse问题正则表达式不是万能的,而有限状态自动机是万能的。
《编译原理》词法分析 有限状态自动机

#7


boost是什么空间啊?和std有什么关系吗?

#8


提醒:解决string parse问题正则表达式不是万能的,而有限状态自动机是万能的。
《编译原理》词法分析 有限状态自动机 

#9


引用 6 楼 zhao4zhong1 的回复:
提醒:解决string parse问题正则表达式不是万能的,而有限状态自动机是万能的。
《编译原理》词法分析 有限状态自动机


我想你提醒我有限状态自动机,是因为我的第一条注释写的不要推荐自己解析吧?
我并没有贬低自己写解析代码的意思

我只是觉得有些人回答问题很不负责任...
我曾经问过一些其他的问题,他们的回答都是简单一句"这么简单的需求,用什么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");
}

#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


接分了
引用 1 楼 peach5460 的回复:
结贴,我自己琢磨出来了...

#5


好多问题自己想象就能解决的。

#6


提醒:解决string parse问题正则表达式不是万能的,而有限状态自动机是万能的。
《编译原理》词法分析 有限状态自动机

#7


boost是什么空间啊?和std有什么关系吗?

#8


提醒:解决string parse问题正则表达式不是万能的,而有限状态自动机是万能的。
《编译原理》词法分析 有限状态自动机 

#9


引用 6 楼 zhao4zhong1 的回复:
提醒:解决string parse问题正则表达式不是万能的,而有限状态自动机是万能的。
《编译原理》词法分析 有限状态自动机


我想你提醒我有限状态自动机,是因为我的第一条注释写的不要推荐自己解析吧?
我并没有贬低自己写解析代码的意思

我只是觉得有些人回答问题很不负责任...
我曾经问过一些其他的问题,他们的回答都是简单一句"这么简单的需求,用什么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");
}

#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


接分了!