首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于从SQL语句中删除注释的正则表达式

问用于从SQL语句中删除注释的正则表达式
EN

Stack Overflow用户
提问于 2012-03-14 03:09:07
回答 8查看 8.6K关注 0票数 7

我正在尝试想出一个正则表达式来删除SQL语句中的注释。

这个正则表达式几乎可以工作:

代码语言:javascript
复制
(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|'(?:[^']|'')*'|(--.*)

除了最后一部分不能很好地处理"--“注释。问题是如何处理用'‘分隔的SQL字符串。

例如,如果我有

代码语言:javascript
复制
SELECT ' -- Hello -- ' FROM DUAL

它不应该匹配,但它是匹配的。

这是用ASP/VBscript编写的。

我考虑过从右到左匹配,但我不认为VBScript的regex引擎支持它。我也尝试过反向回看,但效果并不好。

EN

回答 8

Stack Overflow用户

发布于 2012-12-11 23:35:16

在PHP中,我使用以下代码取消对SQL的注释:

代码语言:javascript
复制
$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 );
票数 7
EN

Stack Overflow用户

发布于 2014-08-21 02:07:08

下面的代码适用于我:

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

通过一个小的正则表达式调整,它可以用来剥离任何语言的注释

票数 4
EN

Stack Overflow用户

发布于 2012-03-14 03:30:33

正如您所说的,您的正则表达式的其余部分都很好,我将重点放在最后一部分。您所需要做的就是验证--是否在开头,然后确保如果超过2个,它会删除所有破折号。

代码语言:javascript
复制
(^[--]+)

如果你想删除注释短划线,而不是整行,上面的代码就是这样的。如果你想把后面的所有东西都放到行尾,也可以运行下面的命令

代码语言:javascript
复制
(^--.*)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9690448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档