区分SQL字符串与注释

时间:2013-08-13 16:02:34

标签: java sql regex string comments

我有想要美化的SQL代码文件,而且我无法区分代码的某一行/部分是字符串还是注释。

我目前的流程是在模式/匹配器中搜索文件,并使用正则表达式N?'([']{2}|[^'])*+'(?!')\s*--.*?\n|/\*.*?\*/的注释删除字符串,并将它们放在各自的存储阵列中以避免格式化它们。

实施例

WHERE y = 'STRING' - > WHERE y = THIS_IS_A_STRINGstrings[0] = 'STRING'

SELECT x --do not format - > SELECT x THIS_IS_A_COMMENTcomments[0] = --do not format

在美化了所有内容后,我会搜索THIS_IS_A_STRINGTHIS_IS_A_COMMENT并从数组中恢复各自的值。

我遇到的问题是注释中是否包含撇号,或者SQL字符串中是否包含双短划线。我可以解决一个问题,但它会导致另一个问题,这取决于我是否选择首先保留字符串或注释。

例如:

首先保留字符串的

--Don't format this'nt format this一直匹配到下一个',(由于能够使用多行字符串)。

另一方面,如果我选择先保留评论:

SELECT x FROM y WHERE z = '--THIS_IS_AS_STRING--',它会检测--并将所有内容存储到注释数组的下一个换行符中。

非常感谢任何帮助。

编辑:我知道我应该用SQL解析器来做这件事,但我一直在研究这个主要是正则表达式,这是我需要完成的最后一步

3 个答案:

答案 0 :(得分:0)

我做了这个reqexp:

/^(([^\\'"\-]+|\-[^\\'"\-]|\\.)+|-?'([^\\']+|\\.)+'|-?"([^\\"]+|\\.)+")+\-\-[^\n]+/

匹配SQL注释的规则

  • 评论行以--,评论和分行结尾。
  • 在评论之前我们可以:
    • \'"-
    • 之外的任何字符
    • -如果没有\'"-
    • 的任何内容
    • 一个\后跟任何字符,包括\'"-
    • 一对',它们之间没有',除非它有{奇数'\ inforont。
    • 一对",它们之间没有",除非它有{奇数'\ inforont。
    • 这些对可以有一个- inforont,但不是2
我错过了什么吗?

答案 1 :(得分:0)

此链接可能会有所帮助: Java Regex find/replace pattern in SQL comments

我在这里粘贴代码

try {
    Pattern regex = Pattern.compile("(?:/\\*[^;]*?\\*/)|(?:--[^;]*?$)", Pattern.DOTALL |    Pattern.MULTILINE);
    Matcher regexMatcher = regex.matcher(subjectString);
    while (regexMatcher.find()) {
        // matched text: regexMatcher.group()
        // match start: regexMatcher.start()
        // match end: regexMatcher.end()
    } 
} catch (PatternSyntaxException ex) {
    // Syntax error in the regular expression
}

我会首先替换注释,然后使用替换的字符串作为字符串正则表达式的输入。这样正则表达式就不会混淆字符串和注释。

答案 2 :(得分:0)

虽然我意识到Song正在寻找这个问题的正则表达式解决方案,但我想指出SQL不是常规的(https://stackoverflow.com/a/5639859/2503659),因此不存在正则表达式解决方案。

话虽如此,我认为其他人已经为常见情况提供了很好的解决方案。