我需要找到並從MySQL查詢中刪除所有評論。我遇到的問題是避免引號或反引號內的註釋標記( - ,#,/ * ... * /)。正則表達式來匹配MySQL評論
回答
不幸的是,你要做的事情需要一個上下文無關的語法,不能用正則表達式來完成。這是因爲嵌套,而在計算機科學理論中,我們需要一個堆棧來跟蹤你什麼時候嵌套在引號或什麼不是。 (從技術上講,這需要下推自動機而不是常規語言,Blah等等,學術界對此......)實施起來並不困難,但必須在程序上完成,並且老實說,可能需要比您想要的更多的努力花費。
如果您不介意切割和粘貼,您可以使用SQLInform。在線模式是免費的,支持評論刪除。
UPDATE
考慮下面我收到的評論,我與MySQL編輯器發揮各地。我錯了 - 他們實際上禁止嵌套比一層更深的東西。你不能再在評論中嵌套評論(如果你可以的話)。無論如何,我將只爲SQLInform鏈接留下我的答案。
字符串和註釋標記都不嵌套:) – Karolis
請考慮:''/ * hello world * /''或''--i; 「'。這些註釋(或第二種情況下的一元運算符)嵌套在引號內,很可能不是用戶想要剝離的東西。 –
有人爲你寫的。轉換爲您需要的任何語言。
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();
}
在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);
不幸的是,你只能做很有限的SQL正則表達式的格式。主要原因是有例如您不想刪除的註釋或不能刪除的標記,因爲它們是文字的一部分,因此不容易找到文字的開頭和結尾,因爲不同的SQL方言使用不同的封閉字符,有時甚至可以使用幾個字符附上一個文字。有時候,人們會在評論中插入一些SQL以備後用。您不想重新格式化這些SQL部分。 使用正則表達式更改SQL語句時,請在數據庫工具中再次運行已更改的SQL,以確保您沒有更改任何邏輯。我聽說有人在沒有檢查結果的情況下對百個od SQL文件運行正則表達式。我認爲這是非常危險的一步。不要改變正在運行的SQL ;-)
此代碼的工作對我來說:
function strip_sqlcomment ($string = '') {
$RXSQLComments = '@('(''|[^'])*')|(--[^\r\n]*)|(\#[^\r\n]*)|(/\*[\w\W]*?(?=\*/)\*/)@ms';
return (($string == '') ? '' : preg_replace($RXSQLComments, '', $string));
}
一點點正則表達式調整它可以用任何語言
- 1. 正則表達式不匹配評論
- 2. 正則表達式匹配的評論
- 3. 正則表達式匹配PHP評論
- 4. 正則表達式 - 匹配評論
- 5. 正則表達式來匹配所有評論//,/ * */
- 6. 正則表達式來匹配評論中的標記
- 7. 評論正則表達式
- 8. 正則表達式來匹配來自Facebook的帖子和評論的句子
- 9. Checkstyle的正則表達式匹配缺少@Ignore評論
- 10. 正則表達式匹配所有排除塊評論
- 11. 節點正則表達式匹配文件中的評論
- 12. FLEX - 正則表達式 - AWK中的匹配評論
- 13. VIM正則表達式匹配直列評論
- 14. Mysql的正則表達式:匹配與正則表達式
- 15. MySQL /正則表達式:部分正則表達式匹配
- 16. MySQL正則表達式匹配
- 17. MySQL的正則表達式字匹配
- 18. mysql正則表達式匹配查詢
- 19. MySQL正則表達式匹配
- 20. 正則表達式在MySQL匹配像
- 21. 正則表達式來匹配單詞
- 22. 正則表達式來匹配
- 23. 正則表達式來排除匹配
- 24. 正則表達式來匹配行尾
- 25. 正則表達式來匹配/
- 26. 正則表達式的C#評論
- 27. 正則表達式匹配
- 28. 正則表達式匹配
- 29. 正則表達式匹配%
- 30. 正則表達式匹配
查找易剝離評論。對手稿進行手動修改。其他任何可能會垃圾你的查詢字符串。 –
正則表達式的語法略有不同,具體取決於你使用的是什麼。你在javascript,php,asp中這樣做? – invertedSpear
你能舉個例子嗎? –