久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

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

      先看要解析的樣例SQL語句:

      復(fù)制代碼 代碼如下:
      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):

      復(fù)制代碼 代碼如下:
      原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):

      復(fù)制代碼 代碼如下:
      原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,你可以拷貝下來使用之:

      復(fù)制代碼 代碼如下:
      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 = ” “;
      /**
      * 是否單行顯示字段,表,條件的標(biāo)識量
      */
      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: 正則表達(dá)式
      * @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中存在,支持正則表達(dá)式
      * @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(“selectn”);
      if(isSingleLine){
      sqlList.add(getAddEnterStr(cols,Comma));
      }
      else{
      sqlList.add(FourSpace+cols);
      }
      }
      if(tables!=null){
      sqlList.add(” nfromn”);
      if(isSingleLine){
      sqlList.add(getAddEnterStr(tables,Comma));
      }
      else{
      sqlList.add(FourSpace+tables);
      }
      }
      if(conditions!=null){
      sqlList.add(” nwheren”);
      if(isSingleLine){
      sqlList.add(getAddEnterStr(conditions,”(and|or)”));
      }
      else{
      sqlList.add(FourSpace+conditions);
      }
      }
      if(groupCols!=null){
      sqlList.add(” ngroup byn”);
      if(isSingleLine){
      sqlList.add(getAddEnterStr(groupCols,Comma));
      }
      else{
      sqlList.add(FourSpace+groupCols);
      }
      }
      if(orderCols!=null){
      sqlList.add(” norder byn”);
      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);
      }
      }
      }
      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號