# 春风博客

### 导航

 < 2008年3月 >
2425262728291
2345678
9101112131415
16171819202122
23242526272829
303112345

• 随笔 - 204
• 文章 - 1
• 评论 - 512
• 引用 - 0

### 公告

MAIL: junglesong@gmail.com
MSN: junglesong_5@hotmail.com

•

• 积分 - 523087
• 排名 - 91

## 一个利用正则表达式解析单句SQL的类SqlParser

select * from dual
SELECT * frOm dual
Select C1,c2 From tb
select c1,c2 from tb
select count(*from t1
select c1,c2,c3 from t1 where condi1=1
Select c1,c2,c3 From t1 Where condi1=1
select c1,c2,c3 from t1,t2 where condi3=3 or condi4=5 order   by o1,o2
Select c1,c2,c3 from t1,t2 Where condi3=3 or condi4=5 Order   by o1,o2
select c1,c2,c3 from t1,t2,t3 where condi1=5 and condi6=6 or condi7=7 group  by g1,g2
Select c1,c2,c3 From t1,t2,t3 Where condi1=5 and condi6=6 or condi7=7 Group  by g1,g2
Select c1,c2,c3 From t1,t2,t3 Where condi1=5 and condi6=6 or condi7=7 Group  by g1,g2,g3 order  by g2,g3

select

*
from
dual

* frOm dual

select

*
from
dual

From tb

select
C1,c2
from
tb

from tb

select
c1,c2
from
tb

count(*from t1

select

count(*)
from
t1

from t1 where condi1=1

select
c1,c2,c3
from
t1
where
condi1
=1

From t1 Where condi1=1

select
c1,c2,c3
from
t1
where
condi1
=1

from t1,t2 where condi3=3 or condi4=5 order   by o1,o2

select
c1,c2,c3
from
t1,t2
where
condi3
=3 or condi4=5
order by
o1,o2

from t1,t2 Where condi3=3 or condi4=5 Order   by o1,o2

select
c1,c2,c3
from
t1,t2
where
condi3
=3 or condi4=5
order by
o1,o2

from t1,t2,t3 where condi1=5 and condi6=6 or condi7=7 group  by g1,g2

select
c1,c2,c3
from
t1,t2,t3
where
condi1
=5 and condi6=6 or condi7=7
group by
g1,g2

From t1,t2,t3 Where condi1=5 and condi6=6 or condi7=7 Group  by g1,g2

select
c1,c2,c3
from
t1,t2,t3
where
condi1
=5 and condi6=6 or condi7=7
group by
g1,g2

From t1,t2,t3 Where condi1=5 and condi6=6 or condi7=7 Group  by g1,g2,g3 order  by g2,g3

select
c1,c2,c3
from
t1,t2,t3
where
condi1
=5 and condi6=6 or condi7=7
group by
g1,g2,g3
order by
g2,g3

select

*
from
dual

* frOm dual

select

*
from
dual

From tb

select
C1,
c2
from
tb

from tb

select
c1,
c2
from
tb

count(*from t1

select

count(*)
from
t1

from t1 where condi1=1

select
c1,
c2,
c3
from
t1
where
condi1
=1

From t1 Where condi1=1

select
c1,
c2,
c3
from
t1
where
condi1
=1

from t1,t2 where condi3=3 or condi4=5 order   by o1,o2

select
c1,
c2,
c3
from
t1,
t2
where
condi3
=3 or
condi4
=5
order by
o1,
o2

from t1,t2 Where condi3=3 or condi4=5 Order   by o1,o2

select
c1,
c2,
c3
from
t1,
t2
where
condi3
=3 or
condi4
=5
order by
o1,
o2

from t1,t2,t3 where condi1=5 and condi6=6 or condi7=7 group  by g1,g2

select
c1,
c2,
c3
from
t1,
t2,
t3
where
condi1
=5 and
condi6
=6 or
condi7
=7
group by
g1,
g2

From t1,t2,t3 Where condi1=5 and condi6=6 or condi7=7 Group  by g1,g2

select
c1,
c2,
c3
from
t1,
t2,
t3
where
condi1
=5 and
condi6
=6 or
condi7
=7
group by
g1,
g2

From t1,t2,t3 Where condi1=5 and condi6=6 or condi7=7 Group  by g1,g2,g3 order  by g2,g3

select
c1,
c2,
c3
from
t1,
t2,
t3
where
condi1
=5 and
condi6
=6 or
condi7
=7
group by
g1,
g2,
g3
order by
g2,
g3

package com.sitinspring.common.sqlFormatter;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
* SQL语句解析器类
*
@author: sitinspring(junglesong@gmail.com)
* @date: 2008-3-12

*/
public class SqlParser{

/**
* 逗号

*/

private static final String Comma = ",";

/**
* 四个空格

*/

private static final String FourSpace = "    ";

/**
* 是否单行显示字段，表，条件的标识量

*/

private static boolean isSingleLine=true;

/**
* 待解析的SQL语句

*/

private String sql;

/**
* SQL中选择的列

*/

private String cols;

/**
* SQL中查找的表

*/

private String tables;

/**
* 查找条件

*/

private String conditions;

/**
* Group By的字段

*/

private String groupCols;

/**
* Order by的字段

*/

private String orderCols;

/**
* 构造函数
* 功能：传入构造函数，解析成字段，表，条件等
*
@param sql：传入的SQL语句

*/

public SqlParser(String sql){

this.sql=sql.trim();

parseCols();
parseTables();
parseConditions();
parseGroupCols();
parseOrderCols();
}

/**
* 解析选择的列
*

*/

private void parseCols(){
String regex
="(select)(.+)(from)";
cols
=getMatchedString(regex,sql);
}

/**
* 解析选择的表
*

*/

private void parseTables(){
String regex
="";

if(isContains(sql,"\\s+where\\s+")){
regex
="(from)(.+)(where)";
}

else{
regex
="(from)(.+)(\$)";
}

tables
=getMatchedString(regex,sql);
}

/**
* 解析查找条件
*

*/

private void parseConditions(){
String regex
="";

if(isContains(sql,"\\s+where\\s+")){

// 包括Where，有条件

if(isContains(sql,"group\\s+by")){

// 条件在where和group by之间
regex="(where)(.+)(group\\s+by)";
}

else if(isContains(sql,"order\\s+by")){

// 条件在where和order by之间
regex="(where)(.+)(order\\s+by)";
}

else{

// 条件在where到字符串末尾
regex="(where)(.+)(\$)";
}
}

else{

// 不包括where则条件无从谈起，返回即可
return;
}

conditions
=getMatchedString(regex,sql);
}

/**
* 解析GroupBy的字段
*

*/

private void parseGroupCols(){
String regex
="";

if(isContains(sql,"group\\s+by")){

// 包括GroupBy，有分组字段

if(isContains(sql,"order\\s+by")){

// group by 后有order by
regex="(group\\s+by)(.+)(order\\s+by)";
}

else{

// group by 后无order by
regex="(group\\s+by)(.+)(\$)";
}
}

else{

// 不包括GroupBy则分组字段无从谈起，返回即可
return;
}

groupCols
=getMatchedString(regex,sql);
}

/**
* 解析OrderBy的字段
*

*/

private void parseOrderCols(){
String regex
="";

if(isContains(sql,"order\\s+by")){

// 包括GroupBy，有分组字段
regex="(order\\s+by)(.+)(\$)";
}

else{

// 不包括GroupBy则分组字段无从谈起，返回即可
return;
}

orderCols
=getMatchedString(regex,sql);
}

/**
* 从文本text中找到regex首次匹配的字符串，不区分大小写
*
@param regex： 正则表达式
*
@param text：欲查找的字符串
*
@return regex首次匹配的字符串，如未匹配返回空

*/

private static String getMatchedString(String regex,String text){
Pattern pattern
=Pattern.compile(regex,Pattern.CASE_INSENSITIVE);

Matcher matcher
=pattern.matcher(text);

while(matcher.find()){

return matcher.group(2);
}

return null;
}

/**
* 看word是否在lineText中存在，支持正则表达式
*
@param lineText
*
@param word
*
@return

*/

private static boolean isContains(String lineText,String word){
Pattern pattern
=Pattern.compile(word,Pattern.CASE_INSENSITIVE);
Matcher matcher
=pattern.matcher(lineText);

return matcher.find();
}

public String toString(){

// 无法解析则原样返回
if(cols==null && tables==null && conditions==null && groupCols==null && orderCols==null ){

return sql;
}

StringBuffer sb
=new StringBuffer();
sb.append(
"原SQL为"+sql+"\n");
sb.append(
"解析后的SQL为\n");

for(String str:getParsedSqlList()){
sb.append(str);
}

sb.append(
"\n");

return sb.toString();
}

/**
* 在分隔符后加上回车
*
@param str
*
@param splitStr
*
@return

*/

private static String getAddEnterStr(String str,String splitStr){
Pattern p
= Pattern.compile(splitStr,Pattern.CASE_INSENSITIVE);

// 用Pattern类的matcher()方法生成一个Matcher对象
Matcher m = p.matcher(str);
StringBuffer sb
= new StringBuffer();

// 使用find()方法查找第一个匹配的对象
boolean result = m.find();

// 使用循环找出模式匹配的内容替换之,再将内容加到sb里
while (result) {
m.appendReplacement(sb, m.group(
0+ "\n     ");
result
= m.find();
}

// 最后调用appendTail()方法将最后一次匹配后的剩余字符串加到sb里；
m.appendTail(sb);

return FourSpace+sb.toString();
}

/**
* 取得解析的SQL字符串列表
*
@return

*/

public List<String> getParsedSqlList(){
List
<String> sqlList=new ArrayList<String>();

// 无法解析则原样返回
if(cols==null && tables==null && conditions==null && groupCols==null && orderCols==null ){

return sqlList;
}

if(cols!=null){
"select\n");

if(isSingleLine){
}

else{
+cols);
}
}

if(tables!=null){
" \nfrom\n");

if(isSingleLine){
}

else{
+tables);
}
}

if(conditions!=null){
" \nwhere\n");

if(isSingleLine){
"(and|or)"));
}

else{
+conditions);
}
}

if(groupCols!=null){
" \ngroup by\n");

if(isSingleLine){
}

else{
+groupCols);
}
}

if(orderCols!=null){
" \norder by\n");

if(isSingleLine){
}

else{
+orderCols);
}
}

return sqlList;
}

/**
* 设置是否单行显示表，字段，条件等
*
@param isSingleLine

*/

public static void setSingleLine(boolean isSingleLine) {
SqlParser.isSingleLine
= isSingleLine;
}

/**
* 测试
*
@param args

*/

public static void main(String[] args){
List
<String> ls=new ArrayList<String>();
"select * from dual");
"SELECT * frOm dual");
"Select C1,c2 From tb");
"select c1,c2 from tb");
"select count(*) from t1");
"select c1,c2,c3 from t1 where condi1=1 ");
"Select c1,c2,c3 From t1 Where condi1=1 ");
"select c1,c2,c3 from t1,t2 where condi3=3 or condi4=5 order   by o1,o2");
"Select c1,c2,c3 from t1,t2 Where condi3=3 or condi4=5 Order   by o1,o2");
"select c1,c2,c3 from t1,t2,t3 where condi1=5 and condi6=6 or condi7=7 group  by g1,g2");
"Select c1,c2,c3 From t1,t2,t3 Where condi1=5 and condi6=6 or condi7=7 Group  by g1,g2");
"Select c1,c2,c3 From t1,t2,t3 Where condi1=5 and condi6=6 or condi7=7 Group  by g1,g2,g3 order  by g2,g3");

for(String sql:ls){
System.out.println(
new SqlParser(sql));

//System.out.println(sql);
}
}
}

posted on 2008-03-14 20:08 sitinspring 阅读(7584) 评论(10)  编辑  收藏 所属分类: 个人作品

### 评论

@lingos

Great job！

@CowNew开源团队

回复  更多评论

@如坐春风

@CowNew开源团队

#### #re: 一个利用正则表达式解析单句SQL的类SqlParser 2008-04-26 11:04 wsand

select c1,c2,c3 from t1,t2 order by o1,o2

#### #re: 一个利用正则表达式解析单句SQL的类SqlParser 2011-05-05 15:11 谢宇

select fromaddr from abc;

#### #re: 一个利用正则表达式解析单句SQL的类SqlParser[未登录] 2014-01-20 13:58 Jason

 只有注册用户登录后才能发表评论。 网站导航: 相关文章:
sitinspring(http://www.blogjava.net)原创,转载请注明出处.