2011-08-17 68 views
1

我需要找到並從MySQL查詢中刪除所有評論。我遇到的問題是避免引號或反引號內的註釋標記( - ,#,/ * ... * /)。正則表達式來匹配MySQL評論

+1

查找易剝離評論。對手稿進行手動修改。其他任何可能會垃圾你的查詢字符串。 –

+0

正則表達式的語法略有不同,具體取決於你使用的是什麼。你在javascript,php,asp中這樣做? – invertedSpear

+0

你能舉個例子嗎? –

回答

3

不幸的是,你要做的事情需要一個上下文無關的語法,不能用正則表達式來完成。這是因爲嵌套,而在計算機科學理論中,我們需要一個堆棧來跟蹤你什麼時候嵌套在引號或什麼不是。 (從技術上講,這需要下推自動機而不是常規語言,Blah等等,學術界對此......)實施起來並不困難,但必須在程序上完成,並且老實說,可能需要比您想要的更多的努力花費。

如果您不介意切割和粘貼,您可以使用SQLInform。在線模式是免費的,支持評論刪除。

UPDATE

考慮下面我收到的評論,我與MySQL編輯器發揮各地。我錯了 - 他們實際上禁止嵌套比一層更深的東西。你不能再在評論中嵌套評論(如果你可以的話)。無論如何,我將只爲SQLInform鏈接留下我的答案。

+0

字符串和註釋標記都不嵌套:) – Karolis

+0

請考慮:''/ * hello world * /''或''--i; 「'。這些註釋(或第二種情況下的一元運算符)嵌套在引號內,很可能不是用戶想要剝離的東西。 –

0

有人爲你寫的。轉換爲您需要的任何語言。

Use Regular Expressions to Clean SQL Statements

這裏是包含在案件原路段曾經消失的答案C#轉換。我沒有測試過,但看起來很合理。

public static string ToRaw(string commandText) 
{ 
    RegexOptions regExOptions = (RegexOptions.IgnoreCase | RegexOptions.Multiline); 
    string rawText=commandText; 
    string regExText = @」(‘(」|[^'])*’)|([\r|\n][\s| ]*[\r|\n])|(–[^\r\n]*)|(/\*[\w\W]*?(?=\*/)\*/)」; 
    //string regExText = @」(‘(」|[^'])*’)|[\t\r\n]|(–[^\r\n]*)|(/\*[\w\W]*?(?=\*/)\*/)」; 
    //’Replace Tab, Carriage Return, Line Feed, Single-row Comments and 
    //’Multi-row Comments with a space when not included inside a text block. 

    MatchCollection patternMatchList = Regex.Matches(rawText, regExText, regExOptions); 
    int iSkipLength = 0; 
    for (int patternIndex = 0; patternIndex < patternMatchList.Count; patternIndex++) 
    { 
     if (!patternMatchList[patternIndex].Value.StartsWith("'") && !patternMatchList[patternIndex].Value.EndsWith("'")) 
     { 
      rawText = rawText.Substring(0, patternMatchList[patternIndex].Index – iSkipLength) + " " + rawText.Substring(patternMatchList[patternIndex].Index – iSkipLength + patternMatchList[patternIndex].Length); 
      iSkipLength += (patternMatchList[patternIndex].Length – " ".Length); 
     } 
    } 
    //'Remove extra spacing that is not contained inside text qualifers. 
    patternMatchList = Regex.Matches(rawText, "'([^']|'')*'|[ ]{2,}", regExOptions); 
    iSkipLength = 0; 
    for (int patternIndex = 0; patternIndex < patternMatchList.Count; patternIndex++) 
    { 
     if (!patternMatchList[patternIndex].Value.StartsWith("'") && !patternMatchList[patternIndex].Value.EndsWith("'")) 
     { 
      rawText = rawText.Substring(0, patternMatchList[patternIndex].Index – iSkipLength)+" " + rawText.Substring(patternMatchList[patternIndex].Index – iSkipLength + patternMatchList[patternIndex].Length); 
      iSkipLength += (patternMatchList[patternIndex].Length – " ".Length); 
     } 
    } 
    //'Return value without leading and trailing spaces. 
    return rawText.Trim(); 
} 
6

在PHP中,我使用這個代碼以取消SQL:

$sqlComments = '@(([\'"`]).*?[^\\\]\2)|((?:\#|--).*?$|/\*(?:[^/*]|/(?!\*)|\*(?!/)|(?R))*\*\/)\s*|(?<=;)\[email protected]'; 
/* Commented version 
$sqlComments = '@ 
    (([\'"`]).*?[^\\\]\2) # $1 : Skip single & double quoted + backticked expressions 
    |(     # $3 : Match comments 
     (?:\#|--).*?$ # - Single line comments 
     |    # - Multi line (nested) comments 
     /\*    # . comment open marker 
      (?: [^/*] # . non comment-marker characters 
       |/(?!\*) # . ! not a comment open 
       |\*(?!/) # . ! not a comment close 
       |(?R) # . recursive case 
      )*   # . repeat eventually 
     \*\/    # . comment close marker 
    )\s*     # Trim after comments 
    |(?<=;)\s+   # Trim after semi-colon 
    @msx'; 
*/ 
$uncommentedSQL = trim(preg_replace($sqlComments, '$1', $sql)); 
preg_match_all($sqlComments, $sql, $comments); 
$extractedComments = array_filter($comments[ 3 ]); 
var_dump($uncommentedSQL, $extractedComments); 
-1

不幸的是,你只能做很有限的SQL正則表達式的格式。主要原因是有例如您不想刪除的註釋或不能刪除的標記,因爲它們是文字的一部分,因此不容易找到文字的開頭和結尾,因爲不同的SQL方言使用不同的封閉字符,有時甚至可以使用幾個字符附上一個文字。有時候,人們會在評論中插入一些SQL以備後用。您不想重新格式化這些SQL部分。 使用正則表達式更改SQL語句時,請在數據庫工具中再次運行已更改的SQL,以確保您沒有更改任何邏輯。我聽說有人在沒有檢查結果的情況下對百個od SQL文件運行正則表達式。我認爲這是非常危險的一步。不要改變正在運行的SQL ;-)

0

此代碼的工作對我來說:

function strip_sqlcomment ($string = '') { 
    $RXSQLComments = '@('(''|[^'])*')|(--[^\r\n]*)|(\#[^\r\n]*)|(/\*[\w\W]*?(?=\*/)\*/)@ms'; 
    return (($string == '') ? '' : preg_replace($RXSQLComments, '', $string)); 
} 

一點點正則表達式調整它可以用任何語言