趁这个时候把之前写过的代码都贴上来吧。
正则表达式一用,整个人都感觉神清气爽了,会了正则表达式,表示字符串解析什么的,顿时轻松了不少啊。不过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[