Я бы сказал, что ваша версия - самый эффективный способ.
Вы могли бы создать регулярное выражение, которое захватит всех за один прогон, но оно, безусловно, не будет таким же быстрым, как то, что вы делаете, и оно только предвидит, что from
следующее, а не за тем, есть ли за ним select
:
Pattern regex = Pattern.compile("\\w+(?=\\s*(?:,|\\bfrom\\b))(?=.*\\bfrom\\b)");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
matchList.add(regexMatcher.group());
}
Так что, в целом, я бы сказал, пойти с тем, что у вас есть. Может сделать звездочку ленивой:
select.*?from