我有想要美化的SQL代码文件,而且我无法区分代码的某一行/部分是字符串还是注释。
我目前的流程是在模式/匹配器中搜索文件,并使用正则表达式N?'([']{2}|[^'])*+'(?!')
和\s*--.*?\n|/\*.*?\*/
的注释删除字符串,并将它们放在各自的存储阵列中以避免格式化它们。
实施例
WHERE y = 'STRING'
- > WHERE y = THIS_IS_A_STRING
和strings[0] = 'STRING'
SELECT x --do not format
- > SELECT x THIS_IS_A_COMMENT
和comments[0] = --do not format
在美化了所有内容后,我会搜索THIS_IS_A_STRING
和THIS_IS_A_COMMENT
并从数组中恢复各自的值。
我遇到的问题是注释中是否包含撇号,或者SQL字符串中是否包含双短划线。我可以解决一个问题,但它会导致另一个问题,这取决于我是否选择首先保留字符串或注释。
例如:
首先保留字符串的 --Don't format this
将'nt format this
一直匹配到下一个'
,(由于能够使用多行字符串)。
另一方面,如果我选择先保留评论:
SELECT x FROM y WHERE z = '--THIS_IS_AS_STRING--'
,它会检测--
并将所有内容存储到注释数组的下一个换行符中。
非常感谢任何帮助。
编辑:我知道我应该用SQL解析器来做这件事,但我一直在研究这个主要是正则表达式,这是我需要完成的最后一步
答案 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),因此不存在正则表达式解决方案。
话虽如此,我认为其他人已经为常见情况提供了很好的解决方案。