最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2012年09月13日 17:41:50   作者:  
一個利用正則表達式解析單句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;
/**
* 構(gòu)造函數(shù)
* 功能:傳入構(gòu)造函數(shù),解析成字段,表,條件等
* @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首次匹配的字符串,不區(qū)分大小寫
* @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();
// 使用循環(huán)找出模式匹配的內(nèi)容替換之,再將內(nèi)容加到sb里
while (result) {
m.appendReplacement(sb, m.group(0) + "\n ");
result = m.find();
}
// 最后調(diào)用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;
}
/**
* 設(shè)置是否單行顯示表,字段,條件等
* @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);
}
}
}

相關(guān)文章

  • php 正則表達式提取網(wǎng)頁超級鏈接url的函數(shù)

    php 正則表達式提取網(wǎng)頁超級鏈接url的函數(shù)

    php 正則表達式提取網(wǎng)頁超級鏈接url的函數(shù)
    2010-01-01
  • 無殤 javascript正則練習器

    無殤 javascript正則練習器

    無殤寫的javascript正則練習器,比較不錯,最后生成替換參數(shù),美中不足的就是替換無法使用,本人也試著修改因為替換參數(shù)過多而無法實現(xiàn),希望會的朋友修正一下
    2007-06-06
  • js replace正則相關(guān)的詭異問題

    js replace正則相關(guān)的詭異問題

    最近做會員個人身份頁的時候遇上如下問題
    2009-10-10
  • 深入分析正則表達式的子模式

    深入分析正則表達式的子模式

    在正則表達式中,可以使用“(”和“)”將模式中的子字符串括起來,以形成一個子模式。將子模式視為一個整體時,那么它就相當于一個單個字符。下面我們就來詳細了解下子模式
    2016-04-04
  • 獲取網(wǎng)址路徑的正則

    獲取網(wǎng)址路徑的正則

    獲取網(wǎng)址路徑的正則,大家可以自己測試下。
    2009-08-08
  • 簡單高效有用的正則表達式

    簡單高效有用的正則表達式

    正則表達式是一組由字母和符號組成的特殊文本,它可以用來從文本中找出滿足你想要的格式的句子,這里為大家分享如何編寫簡單高效有用的正則表達式,需要的朋友可以參考下
    2020-02-02
  • javascript正則表達式基礎(chǔ)篇

    javascript正則表達式基礎(chǔ)篇

    這篇文章主要是介紹javascript正則表達式的一些基礎(chǔ)知識,主要是介紹javascript的正則書寫方法與常用實例,需要的朋友可以參考下
    2013-02-02
  • 還不會正則表達式?趕快看這篇!

    還不會正則表達式?趕快看這篇!

    大家都很多時候都會覺得正則表達式難記、難學、難用,但不可否認的是正則表達式是一項很重要的技能,所有我將學習和使用正則表達式時的關(guān)鍵點整理如下,供大家參考
    2019-06-06
  • 常用的正則表達式實例整理

    常用的正則表達式實例整理

    這篇文章主要介紹了常用的正則表達式實例整理,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2018-03-03
  • JavaScript正則表達式(總結(jié)篇)

    JavaScript正則表達式(總結(jié)篇)

    本文是小編參考其他有關(guān)js正則表達式資料整理的,主要目的有兩個:一:自我復習歸納總結(jié)。二:共享方便大家搜索 。js正則表達式感興趣的朋友可以一起學習
    2016-03-03

最新評論

广河县| 伽师县| 茶陵县| 恩平市| 玉树县| 喀喇| 昔阳县| 利川市| 南乐县| 德兴市| 常德市| 大渡口区| 手游| 大石桥市| 申扎县| 通海县| 方城县| 苏尼特左旗| 尼勒克县| 施甸县| 临猗县| 柞水县| 天等县| 吉木乃县| 福安市| 县级市| 宝清县| 达州市| 丹东市| 湖州市| 马尔康县| 岳西县| 德阳市| 永年县| 郯城县| 韶山市| 岗巴县| 原平市| 军事| 慈溪市| 兖州市|