我正在尝试想出一个正则表达式来删除SQL语句中的注释。
这个正则表达式几乎可以工作:
(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|'(?:[^']|'')*'|(--.*)除了最后一部分不能很好地处理"--“注释。问题是如何处理用'‘分隔的SQL字符串。
例如,如果我有
SELECT ' -- Hello -- ' FROM DUAL它不应该匹配,但它是匹配的。
这是用ASP/VBscript编写的。
我考虑过从右到左匹配,但我不认为VBScript的regex引擎支持它。我也尝试过反向回看,但效果并不好。
发布于 2012-12-11 23:35:16
在PHP中,我使用以下代码取消对SQL的注释:
$sqlComments = '@(([\'"]).*?[^\\\]\2)|((?:\#|--).*?$|/\*(?:[^/*]|/(?!\*)|\*(?!/)|(?R))*\*\/)\s*|(?<=;)\s+@ms';
/* Commented version
$sqlComments = '@
(([\'"]).*?[^\\\]\2) # $1 : Skip single & double quoted 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 );发布于 2014-08-21 02:07:08
下面的代码适用于我:
function strip_sqlcomment ($string = '') {
$RXSQLComments = '@(--[^\r\n]*)|(\#[^\r\n]*)|(/\*[\w\W]*?(?=\*/)\*/)@ms';
return (($string == '') ? '' : preg_replace( $RXSQLComments, '', $string ));
}通过一个小的正则表达式调整,它可以用来剥离任何语言的注释
发布于 2012-03-14 03:30:33
正如您所说的,您的正则表达式的其余部分都很好,我将重点放在最后一部分。您所需要做的就是验证--是否在开头,然后确保如果超过2个,它会删除所有破折号。
(^[--]+)如果你想删除注释短划线,而不是整行,上面的代码就是这样的。如果你想把后面的所有东西都放到行尾,也可以运行下面的命令
(^--.*)https://stackoverflow.com/questions/9690448
复制相似问题