C++正则匹配的使用(尝试给它套进函数里)

//直接复制过来的一堆头文件

#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 ̄)> 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值