C++ 自定义标识识别

闲鱼野鸟 2016-05-06 10:15:44

一段字符串 ,中间可能存在需要特殊处理的地方,实现支持

例如:
  
//以 "[My" 和 “/]”为开始和结束;

string _testStr = "今天天气不错[My color=\"FF00FF\" font=\"cs.ttf\" size=\"36\" txt=\"你要和我一起来春游吗\"/],放风筝吗";
/*************************************************
color : 字体颜色
font : 字体名称
size:字体大小
txt:需要进行特殊处理的字符串
************************************************/

struct _s_TEST_STRUCT
{
string color;
string fonts;
float size;
string txt;

void reset()
{
color = "FFFFFF";
fonts = "微软雅黑.ttf"
size = 36;
txt = "";
}

}TestStruct;

vector<TestStruct> _vecMyTest;

void getString(const string& _strTest, vector<TestStruct>& _vecTest )
{
//这里怎么实现
}



如上,实现解析字符串,并使用自定义结构体进行存储,怎么进行识别呢?getString()函数怎么进行实现
...全文
145 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
闲鱼野鸟 2016-05-09
  • 打赏
  • 举报
回复
引用 9 楼 cyfcsd 的回复:
又修改完善了一下

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>

using namespace std;
//以    "[My"  和  “/]”为开始和结束;
 
string _testStr = "今天天气不错[My color=\"FF00FF\"font=\"cs.ttf\" size=\"36\" txt=\"窗前明月光\"/],放风筝吗"
	"今天天气不错[My color=\"FF00FF\"font=\"cs.ttf\" size=\"36\" txt=\"疑是地上霜\"/],放风筝吗"
	"今天天气不错[My color=\"FF00FF\"font=\"cs.ttf\" size=\"36\" txt=\"举头望明月\"/],放风筝吗"
	"今天天气不错[My color=\"FF00FF\"font=\"cs.ttf\" size=\"36\" txt=\"低头思故乡\"/],放风筝吗";
/*************************************************
color : 字体颜色
font : 字体名称
size:字体大小
txt:需要进行特殊处理的字符串
************************************************/
 
typedef struct _s_TEST_STRUCT
{
  string color;
  string fonts;
  float size;
  string txt;
    
    void reset()
     {
            color = "FFFFFF";
            fonts = "微软雅黑.ttf";
            size = 36;
            txt = "";
      }
 
}TestStruct;
 
string strTable[] = {"My color", "font", "size", "txt"};
TestStruct stringToStruct(string& _str)
{
	//功能:提取固定格式的字符串中的字段值,存储到结构体对象中返回
	//说明:要求输入的字符串格式为[My color=\"xxxxx\"font=\"xxxx\" size=\"xx\" txt=\"xxxx\"/]
	//	字段名为My color、font、size、txt
	//	字段可以不全,缺失字段对应的结构体成员变量赋默认值
	TestStruct ts;	//临时结构体对象
	ts.reset();	//初始化

	//确定各个字段
	string::iterator p_itemBeg;
	string::iterator p_itemEnd;

	string::iterator p_valueBeg;
	string::iterator p_valueEnd;

	//划分 color
	p_itemBeg = strTable[0].begin();
	p_itemEnd = strTable[0].end();
	p_valueBeg = search(_str.begin(), _str.end(), p_itemBeg, p_itemEnd);
	if(p_valueBeg != _str.end()){//存在该字段
		p_valueBeg = find(p_valueBeg, _str.end(), '"');
		p_valueEnd = find(p_valueBeg+1, _str.end(), '"');
		string temp = string(p_valueBeg, p_valueEnd);
		ts.color = temp;
	}

	//划分 fonts
	p_itemBeg = strTable[1].begin();
	p_itemEnd = strTable[1].end();
	p_valueBeg = search(_str.begin(), _str.end(), p_itemBeg, p_itemEnd);
	if(p_valueBeg != _str.end()){//存在该字段
		p_valueBeg = find(p_valueBeg, _str.end(), '"');
		p_valueEnd = find(p_valueBeg+1, _str.end(), '"');
		string temp = string(p_valueBeg, p_valueEnd);
		ts.fonts = temp;
	}

	//划分 size
	p_itemBeg = strTable[2].begin();
	p_itemEnd = strTable[2].end();
	p_valueBeg = search(_str.begin(), _str.end(), p_itemBeg, p_itemEnd);
	if(p_valueBeg != _str.end()){//存在该字段
		p_valueBeg = find(p_valueBeg, _str.end(), '"');
		p_valueEnd = find(p_valueBeg+1, _str.end(), '"');
		string temp = string(p_valueBeg+1, p_valueEnd);
		ts.size = atoi(temp.c_str());
	}

	//划分 txt
	p_itemBeg = strTable[3].begin();
	p_itemEnd = strTable[3].end();
	p_valueBeg = search(_str.begin(), _str.end(), p_itemBeg, p_itemEnd);
	if(p_valueBeg != _str.end()){//存在该字段
		p_valueBeg = find(p_valueBeg, _str.end(), '"');
		p_valueEnd = find(p_valueBeg+1, _str.end(), '"');
		string temp = string(p_valueBeg, p_valueEnd);
		ts.txt = temp;
	}
	return ts;
}
 
void getString(const string& _strTest,  vector<TestStruct>& _vecTest)
{
	//功能:将传入的字符串按格式划分后存储到结构体对象容器中

	//标记划分起始点
	string strBegin = "[My";
	string::const_iterator p_b1 = strBegin.begin();
	string::const_iterator p_b2 = strBegin.end();

	//标记划分终点
	string strEnd = "]";
	string::const_iterator p_e1 = strEnd.begin();
	string::const_iterator p_e2 = strEnd.end();

	string tempStr; //划分后的string
	string::const_iterator p_beg = search(_strTest.begin(), _strTest.end(), p_b1, p_b2);
	string::const_iterator p_end = search(p_beg, _strTest.end(), p_e1, p_e2);
	
	//循环划分、添加
	while(p_end != _strTest.end()){
		tempStr = string(p_beg, p_end+1);
		_vecTest.push_back(stringToStruct(tempStr));
		p_beg = search(p_end, _strTest.end(), p_b1, p_b2);
		p_end = search(p_beg, _strTest.end(), p_e1, p_e2);
	}
}
int main()
{
	//getString(const string& , vector<TestStruct>&) 测试场景
	vector<TestStruct> _testStruct;
	getString(_testStr, _testStruct);
	for(vector<TestStruct>::const_iterator it = _testStruct.begin();
		it != _testStruct.end(); ++it){
	cout<<it->color<<endl;
	cout<<it->fonts<<endl;
	cout<<it->size<<endl;
	cout<<it->txt<<endl;
	}
	//system("pause");
	return 0;
}
这样只是部分,还有“今天天气不错”“放风筝”的处理。。。。。。。。
闲鱼野鸟 2016-05-06
  • 打赏
  • 举报
回复
引用 3 楼 cyfcsd 的回复:
是这个意思吗

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;
//以    "[My"  和  “/]”为开始和结束;
 
string _testStr = "今天天气不错[My color=\"FF00FF\"font=\"cs.ttf\" size=\"36\" txt=\"你要和我一起来春游吗\"/],放风筝吗";
/*************************************************
color : 字体颜色
font : 字体名称
size:字体大小
txt:需要进行特殊处理的字符串
************************************************/
 
struct _s_TEST_STRUCT
{
  string color;
  string fonts;
  float size;
  string txt;
    
    void reset()
     {
            color = "FFFFFF";
            fonts = "微软雅黑.ttf";
            size = 36;
            txt = "";
      }
 
}TestStruct;
 

 
void getString(const string& _strTest,  struct _s_TEST_STRUCT& _structTest )
{
	//功能:将传入的字符串按格式划分后存储到结构体对象中
	string::const_iterator p_beg = _strTest.begin();
	string::const_iterator p_end;

	p_beg = find(p_beg, _strTest.end(),'"');
	p_end = find(p_beg+1, _strTest.end(), '"');
	_structTest.color = string(p_beg+1, p_end);

	p_beg = find(p_end+1, _strTest.end(),'"');
	p_end = find(p_beg+1, _strTest.end(), '"');
	_structTest.fonts = string(p_beg+1, p_end);

	p_beg = find(p_end+1, _strTest.end(),'"');
	p_end = find(p_beg+1, _strTest.end(), '"');
	_structTest.size = atoi(string(p_beg+1, p_end).c_str());

	p_beg = find(p_end+1, _strTest.end(),'"');
	p_end = find(p_beg+1, _strTest.end(), '"');
	_structTest.txt = string(p_beg+1, p_end);

}
int main()
{
	struct _s_TEST_STRUCT _testStruct;
	getString(_testStr, _testStruct);
	cout<<_testStruct.color<<endl;
	cout<<_testStruct.fonts<<endl;
	cout<<_testStruct.size<<endl;
	cout<<_testStruct.txt<<endl;
	system("pause");
	return 0;
}
前面和后面的文字同样需要进行处理,而且如果可能需要填写一个、两个、三个属性,一个字符串中可能存在多个需要特殊处理的地方 例:
aaaa[My color="fffffff" txt="bbbbbbb"/]ccccccccccc[My size="49" txt="dddddd"/]eeeeee
flying_music 2016-05-06
  • 打赏
  • 举报
回复
怎么处理啊?到底是要实现什么功能啊
闲鱼野鸟 2016-05-06
  • 打赏
  • 举报
回复
引用 3 楼 cyfcsd 的回复:
是这个意思吗

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;
//以    "[My"  和  “/]”为开始和结束;
 
string _testStr = "今天天气不错[My color=\"FF00FF\"font=\"cs.ttf\" size=\"36\" txt=\"你要和我一起来春游吗\"/],放风筝吗";
/*************************************************
color : 字体颜色
font : 字体名称
size:字体大小
txt:需要进行特殊处理的字符串
************************************************/
 
struct _s_TEST_STRUCT
{
  string color;
  string fonts;
  float size;
  string txt;
    
    void reset()
     {
            color = "FFFFFF";
            fonts = "微软雅黑.ttf";
            size = 36;
            txt = "";
      }
 
}TestStruct;
 

 
void getString(const string& _strTest,  struct _s_TEST_STRUCT& _structTest )
{
	//功能:将传入的字符串按格式划分后存储到结构体对象中
	string::const_iterator p_beg = _strTest.begin();
	string::const_iterator p_end;

	p_beg = find(p_beg, _strTest.end(),'"');
	p_end = find(p_beg+1, _strTest.end(), '"');
	_structTest.color = string(p_beg+1, p_end);

	p_beg = find(p_end+1, _strTest.end(),'"');
	p_end = find(p_beg+1, _strTest.end(), '"');
	_structTest.fonts = string(p_beg+1, p_end);

	p_beg = find(p_end+1, _strTest.end(),'"');
	p_end = find(p_beg+1, _strTest.end(), '"');
	_structTest.size = atoi(string(p_beg+1, p_end).c_str());

	p_beg = find(p_end+1, _strTest.end(),'"');
	p_end = find(p_beg+1, _strTest.end(), '"');
	_structTest.txt = string(p_beg+1, p_end);

}
int main()
{
	struct _s_TEST_STRUCT _testStruct;
	getString(_testStr, _testStruct);
	cout<<_testStruct.color<<endl;
	cout<<_testStruct.fonts<<endl;
	cout<<_testStruct.size<<endl;
	cout<<_testStruct.txt<<endl;
	system("pause");
	return 0;
}
前面的文字和后面的文字同样需要处理。。。
flying_music 2016-05-06
  • 打赏
  • 举报
回复
是这个意思吗

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;
//以    "[My"  和  “/]”为开始和结束;
 
string _testStr = "今天天气不错[My color=\"FF00FF\"font=\"cs.ttf\" size=\"36\" txt=\"你要和我一起来春游吗\"/],放风筝吗";
/*************************************************
color : 字体颜色
font : 字体名称
size:字体大小
txt:需要进行特殊处理的字符串
************************************************/
 
struct _s_TEST_STRUCT
{
  string color;
  string fonts;
  float size;
  string txt;
    
    void reset()
     {
            color = "FFFFFF";
            fonts = "微软雅黑.ttf";
            size = 36;
            txt = "";
      }
 
}TestStruct;
 

 
void getString(const string& _strTest,  struct _s_TEST_STRUCT& _structTest )
{
	//功能:将传入的字符串按格式划分后存储到结构体对象中
	string::const_iterator p_beg = _strTest.begin();
	string::const_iterator p_end;

	p_beg = find(p_beg, _strTest.end(),'"');
	p_end = find(p_beg+1, _strTest.end(), '"');
	_structTest.color = string(p_beg+1, p_end);

	p_beg = find(p_end+1, _strTest.end(),'"');
	p_end = find(p_beg+1, _strTest.end(), '"');
	_structTest.fonts = string(p_beg+1, p_end);

	p_beg = find(p_end+1, _strTest.end(),'"');
	p_end = find(p_beg+1, _strTest.end(), '"');
	_structTest.size = atoi(string(p_beg+1, p_end).c_str());

	p_beg = find(p_end+1, _strTest.end(),'"');
	p_end = find(p_beg+1, _strTest.end(), '"');
	_structTest.txt = string(p_beg+1, p_end);

}
int main()
{
	struct _s_TEST_STRUCT _testStruct;
	getString(_testStr, _testStruct);
	cout<<_testStruct.color<<endl;
	cout<<_testStruct.fonts<<endl;
	cout<<_testStruct.size<<endl;
	cout<<_testStruct.txt<<endl;
	system("pause");
	return 0;
}
闲鱼野鸟 2016-05-06
  • 打赏
  • 举报
回复
引用 1 楼 cyfcsd 的回复:
就是把一个字符串分解成对应的字段存储到结构体里是吗,为什么要用vector啊
使用什么容器随便,vector, list 等都行,只是怎么进行解析存储
flying_music 2016-05-06
  • 打赏
  • 举报
回复
就是把一个字符串分解成对应的字段存储到结构体里是吗,为什么要用vector啊
flying_music 2016-05-06
  • 打赏
  • 举报
回复
又修改完善了一下

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>

using namespace std;
//以    "[My"  和  “/]”为开始和结束;
 
string _testStr = "今天天气不错[My color=\"FF00FF\"font=\"cs.ttf\" size=\"36\" txt=\"窗前明月光\"/],放风筝吗"
	"今天天气不错[My color=\"FF00FF\"font=\"cs.ttf\" size=\"36\" txt=\"疑是地上霜\"/],放风筝吗"
	"今天天气不错[My color=\"FF00FF\"font=\"cs.ttf\" size=\"36\" txt=\"举头望明月\"/],放风筝吗"
	"今天天气不错[My color=\"FF00FF\"font=\"cs.ttf\" size=\"36\" txt=\"低头思故乡\"/],放风筝吗";
/*************************************************
color : 字体颜色
font : 字体名称
size:字体大小
txt:需要进行特殊处理的字符串
************************************************/
 
typedef struct _s_TEST_STRUCT
{
  string color;
  string fonts;
  float size;
  string txt;
    
    void reset()
     {
            color = "FFFFFF";
            fonts = "微软雅黑.ttf";
            size = 36;
            txt = "";
      }
 
}TestStruct;
 
string strTable[] = {"My color", "font", "size", "txt"};
TestStruct stringToStruct(string& _str)
{
	//功能:提取固定格式的字符串中的字段值,存储到结构体对象中返回
	//说明:要求输入的字符串格式为[My color=\"xxxxx\"font=\"xxxx\" size=\"xx\" txt=\"xxxx\"/]
	//	字段名为My color、font、size、txt
	//	字段可以不全,缺失字段对应的结构体成员变量赋默认值
	TestStruct ts;	//临时结构体对象
	ts.reset();	//初始化

	//确定各个字段
	string::iterator p_itemBeg;
	string::iterator p_itemEnd;

	string::iterator p_valueBeg;
	string::iterator p_valueEnd;

	//划分 color
	p_itemBeg = strTable[0].begin();
	p_itemEnd = strTable[0].end();
	p_valueBeg = search(_str.begin(), _str.end(), p_itemBeg, p_itemEnd);
	if(p_valueBeg != _str.end()){//存在该字段
		p_valueBeg = find(p_valueBeg, _str.end(), '"');
		p_valueEnd = find(p_valueBeg+1, _str.end(), '"');
		string temp = string(p_valueBeg, p_valueEnd);
		ts.color = temp;
	}

	//划分 fonts
	p_itemBeg = strTable[1].begin();
	p_itemEnd = strTable[1].end();
	p_valueBeg = search(_str.begin(), _str.end(), p_itemBeg, p_itemEnd);
	if(p_valueBeg != _str.end()){//存在该字段
		p_valueBeg = find(p_valueBeg, _str.end(), '"');
		p_valueEnd = find(p_valueBeg+1, _str.end(), '"');
		string temp = string(p_valueBeg, p_valueEnd);
		ts.fonts = temp;
	}

	//划分 size
	p_itemBeg = strTable[2].begin();
	p_itemEnd = strTable[2].end();
	p_valueBeg = search(_str.begin(), _str.end(), p_itemBeg, p_itemEnd);
	if(p_valueBeg != _str.end()){//存在该字段
		p_valueBeg = find(p_valueBeg, _str.end(), '"');
		p_valueEnd = find(p_valueBeg+1, _str.end(), '"');
		string temp = string(p_valueBeg+1, p_valueEnd);
		ts.size = atoi(temp.c_str());
	}

	//划分 txt
	p_itemBeg = strTable[3].begin();
	p_itemEnd = strTable[3].end();
	p_valueBeg = search(_str.begin(), _str.end(), p_itemBeg, p_itemEnd);
	if(p_valueBeg != _str.end()){//存在该字段
		p_valueBeg = find(p_valueBeg, _str.end(), '"');
		p_valueEnd = find(p_valueBeg+1, _str.end(), '"');
		string temp = string(p_valueBeg, p_valueEnd);
		ts.txt = temp;
	}
	return ts;
}
 
void getString(const string& _strTest,  vector<TestStruct>& _vecTest)
{
	//功能:将传入的字符串按格式划分后存储到结构体对象容器中

	//标记划分起始点
	string strBegin = "[My";
	string::const_iterator p_b1 = strBegin.begin();
	string::const_iterator p_b2 = strBegin.end();

	//标记划分终点
	string strEnd = "]";
	string::const_iterator p_e1 = strEnd.begin();
	string::const_iterator p_e2 = strEnd.end();

	string tempStr; //划分后的string
	string::const_iterator p_beg = search(_strTest.begin(), _strTest.end(), p_b1, p_b2);
	string::const_iterator p_end = search(p_beg, _strTest.end(), p_e1, p_e2);
	
	//循环划分、添加
	while(p_end != _strTest.end()){
		tempStr = string(p_beg, p_end+1);
		_vecTest.push_back(stringToStruct(tempStr));
		p_beg = search(p_end, _strTest.end(), p_b1, p_b2);
		p_end = search(p_beg, _strTest.end(), p_e1, p_e2);
	}
}
int main()
{
	//getString(const string& , vector<TestStruct>&) 测试场景
	vector<TestStruct> _testStruct;
	getString(_testStr, _testStruct);
	for(vector<TestStruct>::const_iterator it = _testStruct.begin();
		it != _testStruct.end(); ++it){
	cout<<it->color<<endl;
	cout<<it->fonts<<endl;
	cout<<it->size<<endl;
	cout<<it->txt<<endl;
	}
	//system("pause");
	return 0;
}
赵4老师 2016-05-06
  • 打赏
  • 举报
回复
正则表达式速查 正则表达式举例 正则表达式学习 (4页A4纸)http://download.csdn.net/detail/zhao4zhong1/1808549
flying_music 2016-05-06
  • 打赏
  • 举报
回复
这样子?
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>

using namespace std;
//以    "[My"  和  “/]”为开始和结束;
 
string _testStr = "今天天气不错[My color=\"FF00FF\"font=\"cs.ttf\" size=\"36\" txt=\"窗前明月光\"/],放风筝吗"
	"今天天气不错[My color=\"FF00FF\"font=\"cs.ttf\" size=\"36\" txt=\"疑是地上霜\"/],放风筝吗"
	"今天天气不错[My color=\"FF00FF\"font=\"cs.ttf\" size=\"36\" txt=\"举头望明月\"/],放风筝吗"
	"今天天气不错[My color=\"FF00FF\"font=\"cs.ttf\" size=\"36\" txt=\"低头思故乡\"/],放风筝吗";
/*************************************************
color : 字体颜色
font : 字体名称
size:字体大小
txt:需要进行特殊处理的字符串
************************************************/
 
typedef struct _s_TEST_STRUCT
{
  string color;
  string fonts;
  float size;
  string txt;
    
    void reset()
     {
            color = "FFFFFF";
            fonts = "微软雅黑.ttf";
            size = 36;
            txt = "";
      }
 
}TestStruct;
 

 
void getString(const string& _strTest,  vector<TestStruct>& _vecTest)
{
	//功能:将传入的字符串按格式划分后存储到结构体对象中

	//标记划分起始点
	string str = "[My";
	string::const_iterator p_b = str.begin();
	string::const_iterator p_e = str.end();

	TestStruct temp; //临时结构体
	string::const_iterator p_beg = find_first_of(_strTest.begin(), _strTest.end(), p_b, p_e);
	string::const_iterator p_end;
	//循环划分、添加
	while(p_beg != _strTest.end()){
		//划分 color
		p_beg = find(p_beg, _strTest.end(),'"');
		p_end = find(p_beg+1, _strTest.end(), '"');
		temp.color = string(p_beg+1, p_end);

		//划分 fonts
		p_beg = find(p_end+1, _strTest.end(),'"');
		p_end = find(p_beg+1, _strTest.end(), '"');
		temp.fonts = string(p_beg+1, p_end);

		//划分 size
		p_beg = find(p_end+1, _strTest.end(),'"');
		p_end = find(p_beg+1, _strTest.end(), '"');
		temp.size = atoi(string(p_beg+1, p_end).c_str());
		
		//划分 txt
		p_beg = find(p_end+1, _strTest.end(),'"');
		p_end = find(p_beg+1, _strTest.end(), '"');
		temp.txt = string(p_beg+1, p_end);

		_vecTest.push_back(temp);//加入容器

		//更新循环变量,以便判断是否划分完毕
		p_beg = find_first_of(p_end+1, _strTest.end(),p_b,p_e);
	}

}
int main()
{
	//getString(const string& , vector<TestStruct>&) 测试场景
	vector<TestStruct> _testStruct;
	getString(_testStr, _testStruct);
	for(vector<TestStruct>::const_iterator it = _testStruct.begin();
		it != _testStruct.end(); ++it){
	cout<<it->color<<endl;
	cout<<it->fonts<<endl;
	cout<<it->size<<endl;
	cout<<it->txt<<endl;
	}
	//system("pause");
	return 0;
}

64,664

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧