//直接复制过来的一堆头文件
#include "stdafx.h"//纯C++不需要加这个
#include <stdio.h>
#include <string>
#include <winsock2.h>
#include <fstream>
#include <regex>
#include <vector>
#include <iostream>
#include <thread>//并发的头文件
#include <math.h>//取整的头文件
#pragma comment(lib, "ws2_32.lib")
using namespace std;//不加这段命名空间,就会报错cout和endl未声
#define BUF_SIZE 512
//正则匹配分割字符串,匹配后结果存入rexst.s[]数组,结果的个数存入rexst.idsize
struct reg
{
int reg_lock = 0;//正则匹配是否统计过分割、匹配字符串个数,初始化时0,表示未统计
int idsize;//分割字符串份数
string * s;//分割字符串存放位置
int idtize;//匹配字符串份数
string * t;//匹配字符串存放位置
};
reg;
int reg_size(reg * s, string str, string sreg)
{//用于统计分割后字符串份数,便于主函数new申请内存空间
s->idsize = 0;
s->idtize = 0;
regex reg(sreg);//加载正则匹配的公式
int i = 0;
int j = 0;
for (sregex_token_iterator it(str.begin(), str.end(), reg, -1), end; it != end; it++, i++) {
j++;
}
s->idsize = j;//这里统计出总的分割出字符份数
//记数字符串里匹配正则的个数,最后的个数i赋值给rexst.idtize,idtize是t的个数
smatch sm;
string strtoo = str;
i = 0;
while (regex_search(strtoo, sm, reg)) {
strtoo = sm.suffix().str();//每次循环,把剩余未匹配的字符串重新加入str字符串变量
i++;
}
s->idtize = i;
s->reg_lock = 1;//设为已经统计过个数
return 1;
}
int reg_st(reg * s, string str, string sreg)
{//返回-1表示被匹配字符串为空,返回-2匹配正则表达式为空,返回-10没有匹配的项目
if (s->reg_lock == 0) return -1;//假如未统计过分割后字符串份数
regex reg(sreg);//加载正则匹配的公式
int i = 0;
int j = 0;
for (sregex_token_iterator it(str.begin(), str.end(), reg, -1), end; it != end; it++, i++) {
s->s[j] = it->str();//把分割出的字符一一存入数组
j++;//这里有个问题,得到的数组,假如以#为匹配字符,"#123#224#",第一个#前的""空值会被匹配到,最后一个#的""空值不会被匹配到
}
//记数字符串里匹配正则的个数,最后的个数i赋值给rexst.idtize,idtize是t的个数
smatch sm;
string strtoo = str;
i = 0;
strtoo = str;
while (regex_search(strtoo, sm, reg)) {
for (int j = 0; j < sm.size(); ++j)
{
s->t[i] = sm[j];
}
strtoo = sm.suffix().str();//每次循环,把剩余未匹配的字符串重新加入str字符串变量
i++;
}
return 1;
}
int main()
{
int i;
reg sa;
string str,reg;
str = "1246#1124#fde#eetd#sade#sswe#saw#";
reg = "[#]";
reg_size(&sa, str, reg);//统计字符串份数的函数
sa.s = new string[sa.idsize];//用统计出来的字符串份数new新建数组
sa.t = new string[sa.idtize];
reg_st(&sa , str, reg);//把匹配出的字符串存入数组
cout << sa.idsize << endl;
i = 0;
while (1)
{
if (i == sa.idsize) break;
cout << sa.s[i] << endl;
i++;
}
i = 0;
while (1)
{
if (i == sa.idtize) break;
cout << sa.t[i] << endl;
i++;
}
delete[] sa.s;//清理内存
delete[] sa.t;
getchar();
return 1;
}
感觉C++的正则匹配好复杂,所以想套个函数外壳把它变成简单易用的;
还有个问题,[#]*的时候,会陷入无限死循环
大家有没有更加好的方案?有的话留言给我参考参考<( ̄3 ̄)>