剛才在寫一個代碼工具,遇到SQL換行和多餘空格的問題,導緻處理很困難,于是寫了一個正則式,搞定了:
public static void main(String[] args) {
String sql = "SELECT * FROM \n" +
" `testdb`.`foo` LIMIT 0, 100";
String s = "SELECT * FROM `testdb`.`foo` LIMIT 0, 100";
String sql2 = Pattern.compile(" {2,}").matcher(s).replaceAll(" ");
String sql3 = s.replaceAll(" {2,}"," ");
String sql4 = sql.replace('\r', ' ').replace('\n', ' ').replaceAll(" {2,}"," ");;
String sql5 = sql.replace('\r', ' ').replace('\n', ' ').replaceAll(" {2,}?"," ");;
String sql6 = sql.replace('\r', ' ').replace('\n', ' ').replaceAll(" {2,}+"," ");;
System.out.println(sql2);
System.out.println(sql3);
System.out.println(sql4);
System.out.println(sql5);
System.out.println(sql6);
}
輸出結果:
SELECT * FROM `testdb`.`foo` LIMIT 0, 100
SELECT * FROM `testdb`.`foo` LIMIT 0, 100
Process finished with exit code 0
結果可以看出,有一個是沒有去掉多餘空格的。
可見java中的正則式,同樣含義的還有多重寫法,呵呵!其實主要是不同數量詞比對模式在作怪:
原版API文檔中寫道:
Greedy 數量詞
X?
X,一次或一次也沒有
X*
X,零次或多次
X+
X,一次或多次
X{n}
X,恰好 n 次
X{n,}
X,至少 n 次
X{n,m}
X,至少 n 次,但是不超過 m 次
Reluctant 數量詞
X??
X*?
X+?
X{n}?
X{n,}?
X{n,m}?
Possessive 數量詞
X?+
X*+
X++
X{n}+
X{n,}+
X{n,m}+
但是,沒有對三種方式進行更詳細的說明,其實三種模式的差別如下:
Greedy :嘗試找到最長的比對。
Reluctant :嘗試找到最短的比對。
Possessive :也嘗試找到最長的比對。
盡管greedy和possessive迫使一個matcher在進行第一次比對之前讀取整個的text,greedy常常導緻為了找到一個match進行多次嘗試,然而possessive讓一個matcher僅嘗試一個match一次。
下面是一個我工具中的方法:
/**
* 判斷一條SQL語句是否已經是分頁的SQL
*
* @param sql 源SQL
* @return 是已經分頁的SQL時傳回ture,否則傳回False;
*/
public boolean isAlreadySegmentSQL(String sql) {
return sql.replace('\r', ' ').replace('\n', ' ').replaceAll(" {2,}", " ").matches("(?i).+LIMIT [\\d+ *|\\d *, *\\d+].+");
}
還是正則功能強悍啊!
本文轉自 leizhimin 51CTO部落格,原文連結:http://blog.51cto.com/lavasoft/742164,如需轉載請自行聯系原作者