随笔-50  评论-55  文章-8  trackbacks-0
   今天在工作中,遇到这样的情况。首先给你一个SQL语句,比如:
    select * from tableA union select * from tableB
    要根据关键字把两个查询语句分解出来,即得到
   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]);
    }
  }

 但因为这个是SQL语句,union关键字不区分大小写的,所有sql语句有这些情况:
 select * from tableA UNION select * from tableB
 select * from tableA UnIOn select * from tableB
 select * from tableA UNiON select * from tableB
 ……
所以单单用这样的语句:String sql2[]=sql.split(" union ");
是分解不出子语句的。
这里的碰到了特殊情况,我不知道别人是怎么做的,我的思路是应该有种机制sql.split(不区分大小写);
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);
    }
它运用的不过是正则表达式而已,幸好这几天对正则表达式有所研究。
看看正则表达式:

DEELX 正则表达式匹配模式

IGNORECASE

匹配时忽略大小写。默认情况下,正则表达式是要区分大小写的。不管是否指定忽略大小写模式,字符类,比如 [A-Z] 是要区分大小写的。


DEELX 支持对 IGNORECASE, SINGLELINE, MULITLINE, GLOBAL 进行修改 

a(b(?i)c)d

增加 i - IGNORECASE 模式,只对 c 起作用。表达式可以匹配 "abcd" 和 "abCd"

所以我们把
String sql2[]=sql.split(" union ");
修改为
String sql2[]=sql.split(" (?i)union ");
问题即可迎刃而解。
完整的:
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]);
    }
  }

打印结果:
select * from tableA
select * from tableB


posted on 2008-05-04 10:13 蒋家狂潮 阅读(2206) 评论(5)  编辑  收藏 所属分类: Basic

评论:
# re: String split方法在忽略参数大小的情况下取得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]);
}
}

既然是无法区分大小写,不如一开始就替换掉!
  回复  更多评论
  
# re: String split方法在忽略参数大小的情况下取得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"

试问如何替换?本例的前提条件是:
UNION 里的字符大小写不确定

  回复  更多评论
  
# re: String split方法在忽略参数大小的情况下取得String[]的小技巧 2008-05-28 09:59 | 哭人
书写没有强行标准造成的后果...



  回复  更多评论
  
# re: String split方法在忽略参数大小的情况下取得String[]的小技巧 2008-05-28 13:04 | 蒋家狂潮
@哭人
这里给出的方案是在“没有强行标准”的情况下的解决方案,而不是讨论怎么造成“没有强行标准”。  回复  更多评论
  
# re: String split方法在忽略参数大小的情况下取得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]);
}
}
何必这样  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: