2013-10-02 64 views
1

如何從單個字符串中使用Java刪除單行SQL註釋? 我嘗試了類似於以下內容的內容,但這看起來似乎沒有什麼不妥。 需要一個正則表達式,當它們在選擇語句中顯示爲文字時,將處理' - '字符,如從雙重選擇'--hi'。使用java刪除單行SQL註釋

protected String removeSingleLineComments(String sql) 
{ 

    Pattern pattern = Pattern.compile("--[^\r\n]*"); 
    Matcher matcher = pattern.matcher(sql); 


    while(matcher.find()) { 


     if((matcher.start()==0) || (matcher.start()>0 && sql.charAt(matcher.start()-1) != '\'')) 
    { 
     sql =sql.replace(sql.substring(matcher.start(), matcher.end()), "").trim(); 


    } 
    } 
    return sql; 

} 
+0

什麼是你的SQL示例的模式?它總是1行SQL?多行SQL,但你只想刪除最後一行評論?你的代碼如何失敗? –

+0

呃,你確定你的行尾總是有兩個字符嗎?並非每個平臺都使用相同的平臺。如果'Pattern'的值是硬編碼的,則可以將其設爲常量實例。 'String'有一個'replaceAll()'方法,它將輸入字符串(不需要'Pattern' /'Matcher'需要);你的'if'子句可以並且應該是正則表達式的一部分。 –

+0

我知道String.replaceAll()。不過,我需要處理' - '作爲文本塊的一部分出現,就像在 - 從雙重選擇'--hi'一樣。用我的正則表達式,文本'--hi'也會被過濾掉。我需要一個新的模式來解釋文本塊 – user2589299

回答

0

模式看起來沒問題。匹配器被用作:

Pattern pattern = Pattern.compile("^(([^']+|'[^']*')*)--[^\r\n]*"); 
StringBuffer sb = new StringBuffer(); 
while (matcher.find()) { 
    matcher.appendReplacement(sb, "$1"); 
} 
matcher.appendTail(sb); 
return sb.toString(); 

圖案的作用:

^((
    [^']+ 
| 
    '[^']*' 
)*) 
--[^\r\n]* 

線開始,要麼不撇號字符或字符串文字的重複。 額外的括號是$ 1需要剩餘的SQL。

+0

在我的代碼,我也需要進行檢查,看是否「 - 」不是一個文本塊中的一部分 - 選擇雙反「--hi」。在這種情況下,我的模式將不起作用。如何修改正則表達式來解釋文本塊? – user2589299

+0

好的考慮了字符串文字,不考慮反斜槓。 –

+0

我的字符串就像這樣 - String a =「 - hi \ nselect'--hi'from dual \ n - morecomments \ n'。這個正則表達式仍然有效嗎? – user2589299

0

正則表達式應爲:--.*$,以便攜式方式匹配行尾。