使用正则表达式解析一般sql语句(C++)

趁这个时候把之前写过的代码都贴上来吧。
正则表达式一用,整个人都感觉神清气爽了,会了正则表达式,表示字符串解析什么的,顿时轻松了不少啊。不过C和C++现存的大部分编译器是不支持正则表达式的,最新出来的C++10标准(貌似是C++10)中新加入了正则表达式,但是支持最新标准的编译器较少,VS最新版本的应该是支持的。不过博主一直对CodeBlocks情有独钟,忠心不二啊。这就得给编译器装boost函数库了, 这是一项浩大且繁琐的工程,以至于现在想想都会痛哭流涕,当时装了一整天,失败了好多次才装好。
如果你时间实在紧迫,或则怕麻烦,那博主还是建议你使用VS或则放弃C++,C投靠JAVA吧,JAVA中可以直接使用正则表达式很方便的。怎么安装正则表达式我就不详细说了,你得先去boost官网下载boost函数库,然后安装到电脑,最后还得配置到编译器上。有很多详细的介绍,还麻烦大家查一查。
当然,安装好boost库后还得学一学怎么使用正则表达式,正则表达式是有单独的语法的,不过不难,几个小时就能学会吧,给大家推荐一个链接,里面介绍得很详细http://www.jb51.net/tools/zhengze.html
学好了之后就可以应用了,其实之前写的计算器如果用正则表达式可能会方便很多,这里用正则表达式来解析部分的SQL语句,不过只是较为简单的形式,不支持复杂形式如语句嵌套。

C++代码,这个没有代码注释的习惯我以后一定改….另外,如果大家运行不成功,可能是main函数出了问题,因为main函数之前有修改过,其他两个文件是不会有问题的

//头文件,语句解析类
#ifndef SQLEXPRESSION_H_INCLUDED
#define SQLEXPRESSION_H_INCLUDED

#include <string.h>
#include <vector>
#include <boost/regex.hpp>
#include<algorithm>
#include<iostream>

using namespace std;
using namespace boost;

class SqlEx{
public:
    SqlEx(string ex);
    ~SqlEx();
    bool check();
    vector<vector<string>> getResult();
private:
    bool ForUpdate();
    bool ForDelete();
    bool ForInsert();
    bool ForCreate();
    bool ForSelect();
    bool ForDrop();
    string sql(string str);
    vector<vector<string>> result;
    string Ex;
};


#endif // SQLEXPRESSION_H_INCLUDED
#include <fstream>
#include "SQLexpression.h"

using namespace std;
using namespace boost;

SqlEx::SqlEx(string ex){
    Ex = ex;
}

SqlEx::~SqlEx(){
    //delete Vresults;
}
bool SqlEx::check(){
    transform(Ex.begin(),Ex.end(),Ex.begin(),towlower);
    Ex=sql(Ex);

    Ex=Ex+"END";

    string sqlupdate="update\.+set\.+(where\.+)?END";
    string sqldelete="delete\.+from\.+where\.+END";
    string sqlinsert="insert\.+into\.+(\(\.+/)\.*)?values\(.+\)END";
    string sqlcreate="create table\.+\\(\.+\\)END";
    string sqlselect="select\.+from\.+(where\.+)?((group by)?|(order by)?|(having)?)END";
    string sqldrop  ="drop table\.+END";

    regex Pupdate(sqlupdate);
    regex Pdelete(sqldelete);
    regex Pinsert(sqlinsert);
    regex Pcreate(sqlcreate);
    regex Pselect(sqlselect);
    regex Pdrop(sqldrop);

    if(regex_match(Ex,Pupdate)){
       return  ForUpdate();
    }
    else if(regex_match(Ex,Pdelete)){
       return  ForDelete();
    }
    else if(regex_match(Ex,Pinsert)){
        return ForInsert();
    }
    else if(regex_match(Ex,Pcreate)){
        return ForCreate();
    }
    else if(regex_search(Ex,Pselect)){
        return ForSelect();
    }
    else if(regex_match(Ex,Pdrop)){
        return ForDrop();
    }
    else{
            cout<<"请检查你的语句是否正确,不支持该语句!!"<<endl;
            return false;
    }
    return true;
}

bool SqlEx::ForUpdate(){
    vector<vector<string>> Vupdate;
    string str[3];

    smatch sm[3];
    regex re1("(?<=update )\.+(?= set)");
    regex re2("((?<=set )\.+(?= where))|((?<=set )\.+(?=END))");
    regex re3("(?<=where )\.+(?=END)");

    if(regex_search(Ex,sm[0],re1)){
        vector<string>update1;
        str[
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值