1

我有想要美化的 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--',它将检测--并存储所有内容,直到下一个换行符进入 comments 数组。

任何帮助将不胜感激。

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

4

3 回答 3

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
}

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

于 2013-08-13T17:04:11.910 回答
0

我做了这个reqexp:

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

匹配 SQL 注释的 thouse 规则

  • 注释行以--、 注释和换行符结尾。
  • 在评论之前我们可以有:
    • 任何字符,除了\'"-
    • a-如果后面没有任何\'"-
    • a\后跟任何字符,包括\'"-
    • 一对它们之间'没有a ',除非它有奇数个\infront。
    • 一对它们之间"没有a ",除非它有奇数个\infront。
    • 对可以有单个-信息,但不能有 2

我错过了什么吗?

于 2013-08-13T16:39:38.047 回答
0

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

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

于 2013-08-13T17:23:44.243 回答