天天看點

利用Java正規表達式去掉SQL代碼中回車換行和多餘空格

剛才在寫一個代碼工具,遇到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,如需轉載請自行聯系原作者