У меня есть это:
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)
. Можем ли мы лучше?