0

我有一个巨大的代码库,里面有很多 JAVA 和 .sql 文件。我打算从所有这些文件中提取所有 SQL 语句。

这是我打算实现这一目标的方式 -

  1. 构建一个正则表达式文件,其中包含我打算提取的选择、插入、删除、更新等模式。
  2. 在代码库中逐行解析文件并与正则表达式匹配。如果找到匹配项,则注册代码行、文件名、模式等。

当 SQL 查询被分成多行时,问题就出现了。

当我使用 Buffered Reader 读取行时,我正在使用 java.util.regex.Matcher 和 java.util.regex.Pattern 方法来构建/匹配正则表达式模式。

  pattern = Pattern.compile(regexString,Pattern.CASE_INSENSITIVE);
  .
  .
  matcher = pattern.matcher(lineBuffer.readline().trim());
  if( matcher.find()){
    //Do something
  }

对于多行语句,我应该寻找行终止符“;” - 如果找不到,我可以读取下一行并将输出附加到匹配的字符串中,以便将其理解为单个查询。

 while(!lineString.endsWith(";")) {
   lineString = lineString + lineBfr.readLine().trim();
 }

有没有更好的方法来解决这里的需求,使用 Pattern.MULTILINE 或使用 StreamBuffers 我将整个文件读入单个缓冲区并进一步处理?

4

3 回答 3

1

您可以利用Apache Commons及其出色的方法FileUtils#readFileToString(File file)
这与Pattern.MULTILINE您提到的相结合似乎是一个非常简单的解决方案。

于 2012-10-24T13:11:55.000 回答
1

除非您的文件仅包含一致可预测格式的 SQL 语句,否则我认为使用正则表达式解析 SQL 语句将变得非常复杂。

表面上看起来很简单,但是有很多很多特殊情况需要处理。

  • 如何正确处理评论?
  • 那么字符串中包含的单词 SELECT 或分号呢?
  • 字符串转义字符呢?

等等。如果你不处理所有这些,你甚至无法做像获取所有语句这样简单的事情。

更好的方法是使用现有库为您解析 SQL。在这个问题中,Java 似乎有几个不错的选择:SQL parser library for Java

于 2012-10-24T13:22:31.970 回答
0

对于 Java 文件,或者更准确地说,编译的 Java 类,我正在尝试类似的东西,但我正在使用 Java 反编译器javap -verbose来搜索以 SQL 语句开头select或以其他方式显示为 SQL 语句的字符串(Utf8 类型)。

这是一项正在进行的工作,我自己也很困惑,所以我不能发布一个完整的解决方案,但这应该足以建立起来。

于 2018-06-25T19:12:38.847 回答