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

首頁 > 編程 > Regex > 正文

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

2020-03-22 19:28:39
字體:
來源:轉載
供稿:網友
先看要解析的樣例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
*/
html' target='_blank'>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,"http://s+where//s+")){
regex="(from)(.+)(where)";
}
else{
regex="(from)(.+)($)";
}
tables=getMatchedString(regex,sql);
}
/**
* 解析查找條件
*
*/
private void parseConditions(){
String regex="";
if(isContains(sql,"http://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);
}
}
}
PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久综合免费视频| 国产精品亚洲аv天堂网| 中文字幕久久精品| 欧美激情一级欧美精品| 欧美激情视频在线观看| 日韩美女av在线免费观看| 国内精品久久久久久影视8| 亚洲最新视频在线| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲欧美激情一区| 在线播放国产一区二区三区| 欧美性猛交xxxx黑人猛交| 欧美一区二区三区免费观看| 中文字幕国产精品久久| 午夜剧场成人观在线视频免费观看| 亚洲精品日韩在线| 国产99久久精品一区二区| 日韩在线视频国产| 欧美成人免费在线视频| 久久久最新网址| 国产精品夫妻激情| 影音先锋日韩有码| 亚洲偷熟乱区亚洲香蕉av| 亚洲精品有码在线| 国产精品99免视看9| 久久久久国产视频| 亚洲人成电影在线| 福利微拍一区二区| 国产综合视频在线观看| 欧美精品制服第一页| 精品亚洲一区二区三区四区五区| 欧美日韩aaaa| 国产精品久久久久久久9999| 51精品国产黑色丝袜高跟鞋| 精品小视频在线| 2018中文字幕一区二区三区| 久久久久久尹人网香蕉| 欧美性极品xxxx做受| 日本不卡高字幕在线2019| 视频在线观看一区二区| 日韩中文字幕在线观看| 国产精品日本精品| 日韩欧美成人免费视频| 一区二区三区精品99久久| 欧美精品少妇videofree| 亲爱的老师9免费观看全集电视剧| 久久久中精品2020中文| 久久人人爽人人爽人人片av高请| 国产精品第一页在线| 欧美日韩激情美女| 国产丝袜一区二区三区| 精品美女久久久久久免费| 成人福利视频网| 92裸体在线视频网站| 国产精品久久久久免费a∨大胸| 国产精品国产亚洲伊人久久| 91久久久久久久一区二区| 欧美亚洲在线播放| 久久久av免费| 欧美午夜片在线免费观看| 一本色道久久88综合日韩精品| 欧美亚洲国产另类| 好吊成人免视频| 国产乱人伦真实精品视频| 国产a∨精品一区二区三区不卡| 成人性生交大片免费看小说| 亚洲女人被黑人巨大进入| 国产视频久久久久久久| 91色精品视频在线| 欧美激情在线狂野欧美精品| 一本一本久久a久久精品综合小说| 国产精品成av人在线视午夜片| 亚洲色图偷窥自拍| 精品福利视频导航| 亚洲区中文字幕| 国产97在线|日韩| 久久久久久97| 亚洲理论片在线观看| 美女扒开尿口让男人操亚洲视频网站| 国产在线精品一区免费香蕉| 欧美在线视频一区| 亚洲欧美国产高清va在线播| 国产一区二区三区欧美| 97成人精品区在线播放| 精品国产欧美一区二区三区成人| 欧美极品少妇全裸体| 爽爽爽爽爽爽爽成人免费观看| 精品人伦一区二区三区蜜桃网站| 亚洲国产精品推荐| 日韩欧美在线视频日韩欧美在线视频| 上原亚衣av一区二区三区| 亚洲欧美三级在线| 欧美日韩国产区| 成人观看高清在线观看免费| 亚洲黄色在线看| 亚洲美女av在线播放| 欧美精品999| 2019亚洲日韩新视频| 亚洲免费电影一区| 久久资源免费视频| 中文字幕亚洲欧美日韩高清| 亚洲精品久久久久中文字幕二区| 亚洲男人第一av网站| 成人h视频在线观看播放| 色yeye香蕉凹凸一区二区av| 欧美成人黑人xx视频免费观看| 欧美性xxxxxxxxx| 成人妇女淫片aaaa视频| 国产97在线视频| 国产免费一区二区三区香蕉精| 国产91精品最新在线播放| 欧美成人亚洲成人日韩成人| 国产成人午夜视频网址| 国产不卡在线观看| 69久久夜色精品国产69乱青草| 日韩av片永久免费网站| 成人乱色短篇合集| 一区二区成人精品| 国产精品极品美女在线观看免费| 美日韩丰满少妇在线观看| 亚洲精美色品网站| 日韩电影免费在线观看中文字幕| 一级做a爰片久久毛片美女图片| 欧美大片在线看免费观看| 国产精品扒开腿爽爽爽视频| 91九色单男在线观看| 国产成人亚洲综合青青| 亚洲国产精品美女| 国产精品视频午夜| 久久精品免费播放| 日韩精品中文字幕久久臀| 国产91网红主播在线观看| 91色精品视频在线| 成人精品福利视频| 日韩视频在线免费| 国产精品久久久久久久久久新婚| 亚洲bt天天射| 国产精品美乳一区二区免费| 欧美福利视频在线| 亚洲精品v欧美精品v日韩精品| 欧美性极品少妇精品网站| 久久久久久国产精品| 在线视频免费一区二区| 亚洲视频专区在线| 欧美精品久久久久久久久久| 亚洲欧美日韩国产成人| 亚洲国产日韩欧美在线图片| 亚洲美女av在线播放| 国产99视频在线观看| 久久精品国产亚洲7777| 亚洲精品午夜精品| 亚洲欧美日韩直播| 日韩中文字幕在线免费观看| www.99久久热国产日韩欧美.com| 欧美性猛交xxxx免费看| 欧美激情亚洲自拍| 97在线免费观看视频| 97精品视频在线观看| 亚洲精品在线观看www| 亚洲午夜av电影| 国产欧美在线视频| 欧美在线性爱视频| 精品国产乱码久久久久久虫虫漫画| 久久99国产综合精品女同|