隨筆-50  評(píng)論-55  文章-8  trackbacks-0
          ?? 今天在工作中,遇到這樣的情況。首先給你一個(gè)SQL語(yǔ)句,比如:
          ??? select * from tableA union select * from tableB
          ????要根據(jù)關(guān)鍵字把兩個(gè)查詢語(yǔ)句分解出來(lái),即得到
          ?? select * from tableA 和 select * from tableB
          ?? 一般的做法是:
          ?String sql="select * from tableA union select * from tableB";
          ?? if(sql.toLowerCase().indexOf(" union ")>-1){
          ??? String sql2[]=sql.split(" union ");
          ??? for(int i=0;i<sql2.length;i++){
          ????? System.out.println(sql2[i]);
          ??? }
          ? }

          ?但因?yàn)檫@個(gè)是SQL語(yǔ)句,union關(guān)鍵字不區(qū)分大小寫的,所有sql語(yǔ)句有這些情況:
          ?select * from tableA?UNION select * from tableB
          ?select * from tableA?UnIOn select * from tableB
          ?select * from tableA?UNiON select * from tableB
          ?……
          所以單單用這樣的語(yǔ)句:String sql2[]=sql.split(" union ");
          是分解不出子語(yǔ)句的。
          這里的碰到了特殊情況,我不知道別人是怎么做的,我的思路是應(yīng)該有種機(jī)制sql.split(不區(qū)分大小寫);
          String類沒提供該方法,于是我覺得先看看SUN的源碼,了解它的源碼
          是怎么處理的,找到了:
          public int indexOf(String str) {
          ?return indexOf(str, 0);
          ??? }
          ?public String[] split(String regex, int limit) {
          ?return Pattern.compile(regex).split(this, limit);
          ??? }
          它運(yùn)用的不過(guò)是正則表達(dá)式而已,幸好這幾天對(duì)正則表達(dá)式有所研究。
          看看正則表達(dá)式:

          DEELX 正則表達(dá)式匹配模式

          IGNORECASE

          匹配時(shí)忽略大小寫。默認(rèn)情況下,正則表達(dá)式是要區(qū)分大小寫的。不管是否指定忽略大小寫模式,字符類,比如 [A-Z] 是要區(qū)分大小寫的。


          DEELX 支持對(duì) IGNORECASE, SINGLELINE, MULITLINE, GLOBAL 進(jìn)行修改?

          a(b(?i)c)d

          增加 i - IGNORECASE 模式,只對(duì) c 起作用。表達(dá)式可以匹配 "abcd" 和 "abCd"

          所以我們把
          String sql2[]=sql.split(" union ");
          修改為
          String sql2[]=sql.split(" (?i)union ");
          問(wèn)題即可迎刃而解。
          完整的:
          String sql="select * from tableA union select * from tableB";
          ?? if(sql.toLowerCase().indexOf(" union ")>-1){
          ??? String sql2[]=sql.split(" (?i)union ");
          ??? for(int i=0;i<sql2.length;i++){
          ????? System.out.println(sql2[i]);
          ??? }
          ? }

          打印結(jié)果:
          select * from tableA
          select * from tableB


          posted on 2008-05-04 10:13 蔣家狂潮 閱讀(2221) 評(píng)論(5)  編輯  收藏 所屬分類: Basic

          評(píng)論:
          # re: String split方法在忽略參數(shù)大小的情況下取得String[]的小技巧[未登錄] 2008-05-27 02:59 | 李敏
          String sql = "select * from tableA UNION select * from tableB"
          .replaceFirst("UNION", "union");
          if (sql.indexOf(" union ") > -1) {
          String sql2[] = sql.split(" union ");
          for (int i = 0; i < sql2.length; i++) {
          System.out.println(sql2[i]);
          }
          }

          既然是無(wú)法區(qū)分大小寫,不如一開始就替換掉!
            回復(fù)  更多評(píng)論
            
          # re: String split方法在忽略參數(shù)大小的情況下取得String[]的小技巧 2008-05-27 14:34 | 蔣家狂潮
          樓上誤解了,
          String sql = "select * from tableA UNION select * from tableB"
          "select * from tableA UnION select * from tableB"
          "select * from tableA UNiON select * from tableB"
          "select * from tableA UNIoN select * from tableB"
          "select * from tableA UnIon select * from tableB"

          試問(wèn)如何替換?本例的前提條件是:
          UNION 里的字符大小寫不確定

            回復(fù)  更多評(píng)論
            
          # re: String split方法在忽略參數(shù)大小的情況下取得String[]的小技巧 2008-05-28 09:59 | 哭人
          書寫沒有強(qiáng)行標(biāo)準(zhǔn)造成的后果...



            回復(fù)  更多評(píng)論
            
          # re: String split方法在忽略參數(shù)大小的情況下取得String[]的小技巧 2008-05-28 13:04 | 蔣家狂潮
          @哭人
          這里給出的方案是在“沒有強(qiáng)行標(biāo)準(zhǔn)”的情況下的解決方案,而不是討論怎么造成“沒有強(qiáng)行標(biāo)準(zhǔn)”。  回復(fù)  更多評(píng)論
            
          # re: String split方法在忽略參數(shù)大小的情況下取得String[]的小技巧 2008-07-18 16:11 | 大水牛
          String sql="select * from tableA union select * from tableB";
          if(sql.toLowerCase().indexOf(" union ")>-1){
          String sql2[]=sql.toLowerCase().split(" union ");
          for(int i=0;i<sql2.length;i++){
          System.out.println(sql2[i]);
          }
          }
          何必這樣  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 石城县| 中牟县| 茶陵县| 交城县| 扶风县| 永泰县| 名山县| 巫山县| 昂仁县| 革吉县| 襄樊市| 修武县| 五台县| 泽普县| 金川县| 奉化市| 绥滨县| 郁南县| 镶黄旗| 斗六市| 潜江市| 朔州市| 崇州市| 北辰区| 兰溪市| 双柏县| 涿州市| 龙口市| 台山市| 宁南县| 新源县| 应用必备| 无棣县| 江津市| 泸溪县| 南充市| 宜阳县| 浦东新区| 江陵县| 肇东市| 绍兴市|