У меня есть это:
import java.util.regex.*;
String regex = "(?<m1>(hello|universe))|(?<m2>(hello world))";
String s = "hello world";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(s);
while(matcher.find()) {
MatchResult matchResult = m.toMatchResult();
String substring = s.substring(matchResult.start(), matchResult.end());
System.out.println(substring);
}
Вышеприведенное только печатает hello, тогда как я хочу, чтобы он печатал hello world.
Один из способов исправить это - переупорядочить группы в String regex = "(?<m2>(hello world))|(?<m1>(hello|universe))", но у меня нет контроля над регулярным выражением, которое я получаю в моем случае...
Итак, что является лучшим способом найти самый длинный матч? Очевидным способом было бы проверить все возможные подстроки s, как указано здесь (Эффективно найти все совпадающие соответствия для регулярного выражения) по длине и выбрать первый, но O(n^2). Можем ли мы лучше?