亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Regex > 正文

SqlParser 一個利用正則表達式解析單句SQL的類

2020-03-16 21:09:43
字體:
來源:轉載
供稿:網友
一個利用正則表達式解析單句SQL的類,需要的朋友可以參考下
 
 
先看要解析的樣例SQL語句: 
復制代碼代碼如下:

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 

解析效果之一(isSingleLine=false): 
復制代碼代碼如下:

原SQL為select * from dual 
解析后的SQL為 
select 

from 
dual 
原SQL為SELECT * frOm dual 
解析后的SQL為 
select 

from 
dual 
原SQL為Select C1,c2 From tb 
解析后的SQL為 
select 
C1,c2 
from 
tb 
原SQL為select c1,c2 from tb 
解析后的SQL為 
select 
c1,c2 
from 
tb 
原SQL為select count(*) from t1 
解析后的SQL為 
select 
count(*) 
from 
t1 
原SQL為select c1,c2,c3 from t1 where condi1=1 
解析后的SQL為 
select 
c1,c2,c3 
from 
t1 
where 
condi1=1 
原SQL為Select c1,c2,c3 From t1 Where condi1=1 
解析后的SQL為 
select 
c1,c2,c3 
from 
t1 
where 
condi1=1 
原SQL為select c1,c2,c3 from t1,t2 where condi3=3 or condi4=5 order by o1,o2 
解析后的SQL為 
select 
c1,c2,c3 
from 
t1,t2 
where 
condi3=3 or condi4=5 
order by 
o1,o2 
原SQL為Select c1,c2,c3 from t1,t2 Where condi3=3 or condi4=5 Order by o1,o2 
解析后的SQL為 
select 
c1,c2,c3 
from 
t1,t2 
where 
condi3=3 or condi4=5 
order by 
o1,o2 
原SQL為select c1,c2,c3 from t1,t2,t3 where condi1=5 and condi6=6 or condi7=7 group by g1,g2 
解析后的SQL為 
select 
c1,c2,c3 
from 
t1,t2,t3 
where 
condi1=5 and condi6=6 or condi7=7 
group by 
g1,g2 
原SQL為Select c1,c2,c3 From t1,t2,t3 Where condi1=5 and condi6=6 or condi7=7 Group by g1,g2 
解析后的SQL為 
select 
c1,c2,c3 
from 
t1,t2,t3 
where 
condi1=5 and condi6=6 or condi7=7 
group by 
g1,g2 
原SQL為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 
解析后的SQL為 
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 

解析效果之二(isSingleLine=true): 
復制代碼代碼如下:

原SQL為select * from dual 
解析后的SQL為 
select 

from 
dual 
原SQL為SELECT * frOm dual 
解析后的SQL為 
select 

from 
dual 
原SQL為Select C1,c2 From tb 
解析后的SQL為 
select 
C1, 
c2 
from 
tb 
原SQL為select c1,c2 from tb 
解析后的SQL為 
select 
c1, 
c2 
from 
tb 
原SQL為select count(*) from t1 
解析后的SQL為 
select 
count(*) 
from 
t1 
原SQL為select c1,c2,c3 from t1 where condi1=1 
解析后的SQL為 
select 
c1, 
c2, 
c3 
from 
t1 
where 
condi1=1 
原SQL為Select c1,c2,c3 From t1 Where condi1=1 
解析后的SQL為 
select 
c1, 
c2, 
c3 
from 
t1 
where 
condi1=1 
原SQL為select c1,c2,c3 from t1,t2 where condi3=3 or condi4=5 order by o1,o2 
解析后的SQL為 
select 
c1, 
c2, 
c3 
from 
t1, 
t2 
where 
condi3=3 or 
condi4=5 
order by 
o1, 
o2 
原SQL為Select c1,c2,c3 from t1,t2 Where condi3=3 or condi4=5 Order by o1,o2 
解析后的SQL為 
select 
c1, 
c2, 
c3 
from 
t1, 
t2 
where 
condi3=3 or 
condi4=5 
order by 
o1, 
o2 
原SQL為select c1,c2,c3 from t1,t2,t3 where condi1=5 and condi6=6 or condi7=7 group by g1,g2 
解析后的SQL為 
select 
c1, 
c2, 
c3 
from 
t1, 
t2, 
t3 
where 
condi1=5 and 
condi6=6 or 
condi7=7 
group by 
g1, 
g2 
原SQL為Select c1,c2,c3 From t1,t2,t3 Where condi1=5 and condi6=6 or condi7=7 Group by g1,g2 
解析后的SQL為 
select 
c1, 
c2, 
c3 
from 
t1, 
t2, 
t3 
where 
condi1=5 and 
condi6=6 or 
condi7=7 
group by 
g1, 
g2 
原SQL為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 
解析后的SQL為 
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 

使用的類SqlParser,你可以拷貝下來使用之: 
復制代碼代碼如下:

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 ){ 
sqlList.add(sql); 
return sqlList; 

if(cols!=null){ 
sqlList.add("select/n"); 
if(isSingleLine){ 
sqlList.add(getAddEnterStr(cols,Comma)); 

else{ 
sqlList.add(FourSpace+cols); 


if(tables!=null){ 
sqlList.add(" /nfrom/n"); 
if(isSingleLine){ 
sqlList.add(getAddEnterStr(tables,Comma)); 

else{ 
sqlList.add(FourSpace+tables); 


if(conditions!=null){ 
sqlList.add(" /nwhere/n"); 
if(isSingleLine){ 
sqlList.add(getAddEnterStr(conditions,"(and|or)")); 

else{ 
sqlList.add(FourSpace+conditions); 


if(groupCols!=null){ 
sqlList.add(" /ngroup by/n"); 
if(isSingleLine){ 
sqlList.add(getAddEnterStr(groupCols,Comma)); 

else{ 
sqlList.add(FourSpace+groupCols); 


if(orderCols!=null){ 
sqlList.add(" /norder by/n"); 
if(isSingleLine){ 
sqlList.add(getAddEnterStr(orderCols,Comma)); 

else{ 
sqlList.add(FourSpace+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>(); 
ls.add("select * from dual"); 
ls.add("SELECT * frOm dual"); 
ls.add("Select C1,c2 From tb"); 
ls.add("select c1,c2 from tb"); 
ls.add("select count(*) from t1"); 
ls.add("select c1,c2,c3 from t1 where condi1=1 "); 
ls.add("Select c1,c2,c3 From t1 Where condi1=1 "); 
ls.add("select c1,c2,c3 from t1,t2 where condi3=3 or condi4=5 order by o1,o2"); 
ls.add("Select c1,c2,c3 from t1,t2 Where condi3=3 or condi4=5 Order by o1,o2"); 
ls.add("select c1,c2,c3 from t1,t2,t3 where condi1=5 and condi6=6 or condi7=7 group by g1,g2"); 
ls.add("Select c1,c2,c3 From t1,t2,t3 Where condi1=5 and condi6=6 or condi7=7 Group by g1,g2"); 
ls.add("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); 



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产一区二区三区在线看| 亚洲精品99久久久久中文字幕| 色综合视频一区中文字幕| 欧美激情第6页| 亚洲成人精品久久| 中文字幕亚洲色图| 91沈先生在线观看| 中文字幕在线视频日韩| 亚洲欧洲在线免费| 欧美三级xxx| 91免费精品视频| 日韩高清a**址| 国产亚洲激情在线| 国产成人精品久久亚洲高清不卡| 26uuu日韩精品一区二区| 成人在线视频福利| 国产大片精品免费永久看nba| 久久久久久久久久久久久久久久久久av| 久久亚洲精品视频| 久久好看免费视频| 亚洲精品久久久久| 久久久久久久久国产精品| www.日韩系列| 久久精品亚洲国产| 欧美综合一区第一页| 久久影院模特热| 日韩亚洲国产中文字幕| 日韩av电影手机在线| 色久欧美在线视频观看| 国产欧美一区二区三区四区| 亚洲国产一区二区三区四区| 国产精品久久久999| 亚洲三级黄色在线观看| 久久久女人电视剧免费播放下载| 中文一区二区视频| 精品偷拍一区二区三区在线看| 亚洲在线观看视频| 另类色图亚洲色图| 97久久精品在线| 欧美日韩亚洲一区二区三区| 国产日韩欧美视频| 中文字幕亚洲第一| 亚洲国产欧美一区二区三区同亚洲| 成人久久一区二区| 国产视频综合在线| 色综合天天综合网国产成人网| 精品日本美女福利在线观看| 欧美日韩一区二区在线播放| 亚洲免费福利视频| 亚洲图片制服诱惑| 国产精品99久久99久久久二8| 久久中文字幕在线| 欧美在线一区二区三区四| 2019最新中文字幕| 亚洲欧美精品伊人久久| 亚洲美女福利视频网站| 日韩欧美亚洲成人| 成人情趣片在线观看免费| 中文字幕一精品亚洲无线一区| 国产欧美精品va在线观看| 欧美最猛黑人xxxx黑人猛叫黄| 亚洲男人av电影| 中文字幕亚洲一区二区三区五十路| 亚洲成人中文字幕| 国产精品成人v| 亚洲欧美一区二区三区四区| 国产成人综合一区二区三区| 一本色道久久综合亚洲精品小说| 欧美日韩成人在线视频| 精品视频一区在线视频| 夜夜狂射影院欧美极品| 亚洲天堂开心观看| 精品久久久久久中文字幕大豆网| 亚洲国产精品yw在线观看| 久久免费观看视频| 精品少妇一区二区30p| 国产精品扒开腿做爽爽爽视频| 国产免费成人av| 国产一区二区三区视频| 欧美成年人视频网站| 亚洲国产欧美久久| 久久精品国产69国产精品亚洲| 国产视频一区在线| 欧美有码在线观看视频| 最近2019年日本中文免费字幕| xxxx性欧美| 亚洲精品99久久久久中文字幕| 欧美一级bbbbb性bbbb喷潮片| 91在线高清视频| 亚洲精品v欧美精品v日韩精品| 在线视频一区二区| 成人激情电影一区二区| 国产精品a久久久久久| 国产在线高清精品| 日韩高清电影免费观看完整版| 亚洲精品网站在线播放gif| 国产精品福利在线观看| 成人国产在线激情| 久久精品国产一区二区电影| 精品久久久久久久久久ntr影视| 欧美成人精品xxx| 91精品在线影院| 欧美激情一区二区三区成人| 亚洲free嫩bbb| 日韩精品在线观看一区| 国产99久久精品一区二区 夜夜躁日日躁| 中文字幕av一区| 欧美精品18videos性欧| 黑人巨大精品欧美一区免费视频| 97在线看福利| 亚洲最大av网站| 国产一区二区视频在线观看| 色无极影院亚洲| 欧美夫妻性生活视频| 欧美在线视频免费播放| 久久精品国产久精国产思思| 欧美性生活大片免费观看网址| 久久免费国产精品1| 色偷偷偷亚洲综合网另类| 日韩视频免费在线观看| 中文字幕日本精品| 国产成人拍精品视频午夜网站| 亚洲第一精品久久忘忧草社区| 日本成人精品在线| 96国产粉嫩美女| 国产精品成人v| 欧美午夜影院在线视频| 久久精品电影网| 97视频在线看| 欧美精品videosex性欧美| 亚洲黄色av女优在线观看| 久久综合伊人77777蜜臀| 国产一区二区三区直播精品电影| 亚洲成年人在线播放| 91经典在线视频| 色婷婷综合成人| 日韩大片在线观看视频| 国产精品18久久久久久麻辣| 亚洲欧美中文字幕| 久久九九国产精品怡红院| 亚洲一二在线观看| 国产视频自拍一区| 亚洲已满18点击进入在线看片| 欧美猛男性生活免费| 国产精品美女久久久久av超清| 久久精品在线播放| 精品爽片免费看久久| 91在线视频一区| 欧美影院在线播放| 亚洲国产精久久久久久久| 久久久欧美精品| 亚洲色图狂野欧美| 欧美性猛交xxxx乱大交3| 日韩中文字幕国产精品| 精品国产一区二区三区四区在线观看| 日本精品久久久久久久| 国产欧洲精品视频| 久久影视电视剧凤归四时歌| 欧美日韩在线观看视频| 91日韩在线播放| 成人信息集中地欧美| 中文字幕v亚洲ⅴv天堂| 日韩在线www| 日韩电影在线观看免费|