#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;
}