Чтение и извлечение нескольких SQL-запросов в строке и сохранение их в списке в Java

#java #regex

#java #регулярное выражение

Вопрос:

Мне нужно извлечь только SQL-запросы (все из них) и сохранить их в списке, чтобы передать аргумент в Java.

Это пример входной строки

 section Section1; shared Data_first = let Source = Sourcename.Database("abc.net", [HierarchicalNavigation=true , Query=" SELECT Company_ , Corporate_ , Corporate_Name , Group_Name , Division_Name , Market_Name FROM Entity_table WHERE CODE = '12345' "]), in #"Renamed Columns"; shared Data_first = let Source = Sourcename.Database("abc.net", [HierarchicalNavigation=true , Query=" SELECT column1, column2 FROM table1, table2 WHERE column2='value'; "]), in #"Renamed Columns"; shared Data_first = let Source = Sourcename.Database("abc.net", [HierarchicalNavigation=true , Query="SELECT Company_ , Corporate_ , Corporate_Name , Group_Name , Division_Name , Market_Name FROM Entity_table_three WHERE CODE = '78901'"]), in #"Renamed Columns";
 

Вот код, который я пробовал, но он извлекает только первый запрос. Мне нужны все запросы, присутствующие в строке. Я не знаком с регулярными выражениями, поэтому не пробовал.

 public static String ReadBigStringIn(BufferedReader buffIn, String st) throws IOException {
    StringBuilder everything = new StringBuilder();
       
    StringBuilder lines = null ;
    while( (st = buffIn.readLine()) != null) {
        lines = everything.append(st);
    }
    String myQuery = lines.toString().substring(lines.toString().indexOf("Query"));
    System.out.println("myQuery: n"  myQuery);
    String query= substringBetween(myQuery, "Query="", ""])");
    System.out.println("myQuery2: n"  query);
    return query;
 

Заранее спасибо!

Ответ №1:

Вы можете использовать положительный предварительный просмотр и положительный обратный просмотр, чтобы захватить подстроку между текстами Query=" и следующим " с помощью этого регулярного выражения: (?<=Query=\")\s*(.*?)(?=\") :

 Pattern pattern = Pattern.compile("((?<=Query=\").*?(?=\"))");
Matcher matcher = pattern.matcher(lines);
while(matcher.find()) {
    System.out.println(matcher.group(1));
}
 
  • (?<=Query=") : положительный взгляд назад, совпадает, если строке предшествует Query="
  • \s* : ноль или более пробелов, чтобы избавиться от пробелов после "
  • (.*?) : сопоставьте что угодно, ? не жадно (до следующего " )
  • (?=") : положительный прогноз, совпадает, если за строкой следует "

Вывод:

 SELECT Company_ , Corporate_ , Corporate_Name , Group_Name , Division_Name , Market_Name FROM Entity_table WHERE CODE = '12345' 
SELECT column1, column2 FROM table1, table2 WHERE column2='value'; 
SELECT Company_ , Corporate_ , Corporate_Name , Group_Name , Division_Name , Market_Name FROM Entity_table_three WHERE CODE = '78901'
 

Ответ №2:

Я бы использовал сопоставитель регулярных выражений Java со следующим шаблоном:

 "s*(SELECT.*?)s*"
 


ДЕМОНСТРАЦИЯ

Ваш обновленный код:

 public static List<String> getAllQueries (BufferedReader in) throws IOException {
    String line;
    StringBuffer lines = new StringBuilder();
    List<String> queries = new ArrayList<>();

    while ((line = in.readLine()) != null) {
        lines.append(st).append("n");
    }

    String pattern = ""s*(SELECT.*?)s*"";
    Pattern p = Pattern.compile(pattern);
    Matcher m = r.matcher(lines.toString());
    while (m.find()) {
        queries.add(m.group(1));
    }

    return queries;
}