我有一些想要美化的 SQL 代码文件,但我无法区分代码的某一行/部分是字符串还是注释。
我当前的流程是对文件进行模式/匹配器搜索,并使用正则表达式 N?'([']{2}|[^'])*+'(?! ')
以及带有 \s*--.*?\n|/\*.*?\*/
的注释,并将它们放入各自的存储数组中,以避免格式化它们。
示例:
WHERE y = 'STRING'
-> WHERE y = THIS_IS_A_STRING
和 strings[0] = 'STRING'
SELECT x --不格式化
-> SELECT x THIS_IS_A_COMMENT
和 comments[0] = --不格式化
美化所有内容后,我会遍历并搜索 THIS_IS_A_STRING
和 THIS_IS_A_COMMENT
并从数组中恢复它们各自的值。
我遇到的问题是注释中是否包含撇号,或者 SQL 字符串中是否包含双破折号。我可以解决一个问题,但它会导致另一个问题,具体取决于我选择先保留字符串还是注释。
例如:
--不要格式化此内容
,首先保留字符串将匹配'不格式化此内容
一直到下一个'
,(由于能够具有多行字符串)。
另一方面,如果我选择先保留评论:
SELECT x FROM y WHERE z = '--THIS_IS_AS_STRING--'
,它将检测 --
并将所有内容存储到注释数组中,直到下一个换行符。
任何帮助将不胜感激。
编辑:我知道我可能应该使用 SQL 解析器来完成此操作,但我一直主要使用正则表达式来完成此操作,这是我需要完成的最后一步
最佳答案
我做了这个请求表达式:
/^(([^\\'"\-]+|\-[^\\'"\-]|\\.)+|-?'([^\\']+|\\.)+'|-?"([^\\"]+|\\.)+")+\-\-[^\n]+/
匹配SQL注释的规则
- 注释行以
--
、注释和换行符结尾。 - 在评论之前我们可以有:
- 除
\'"-
之外的任何字符 - a
-
(如果后面没有任何\'"-
)
\
后跟任何字符,包括\'"-
- 一对
'
,它们之间没有'
,除非其前面有奇数个\
。 - 一对
"
,它们之间没有"
,除非其前面有奇数个\
。 - 这些对可以有一个
-
信息,但不能有 2
- 除
我错过了什么吗?
关于java - 区分 SQL 字符串和注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18213928/