java - 区分 SQL 字符串和注释

标签 java sql regex string comments

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

我当前的流程是对文件进行模式/匹配器搜索,并使用正则表达式 N?'([']{2}|[^'])*+'(?! ') 以及带有 \s*--.*?\n|/\*.*?\*/ 的注释,并将它们放入各自的存储数组中,以避免格式化它们。

示例:

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

SELECT x --不格式化-> SELECT x THIS_IS_A_COMMENTcomments[0] = --不格式化

美化所有内容后,我会遍历并搜索 THIS_IS_A_STRINGTHIS_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/

相关文章:

mysql - PCRE Regex - 替换序列化字符串中的 URL

python - 当字符位于 unicode 范围内时,如何用空格填充字符?

java - JScrollPane 中的 JTabbedPane 一次仅显示一项

php - SQL:基于条件的字段值?

对行进行分组和连接的 SQL 查询

mysql - 不存在时插入null时更新

c++ - 将多行分隔符与 C++ 2011 正则表达式 (ECMAScript) 匹配的问题

java - 写入 ClassPath 上的数据文件不会反射(reflect)在项目中?

java - java中如何接受null JTextField?

java - 为什么本地声明的原语进入堆栈,而本地定义的对象进入堆?