В настоящее время я использую Java 8, и следующий код зависает:
Pattern.compile("(a|aa)+")
.matcher("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab")
.matches()
Видя, как вы используете Java 11 (а также тестировали его с Java 9/10) и видели, что для его завершения требуется небольшое количество времени, очевидно, между этими версиями произошли изменения.
Посмотрев на исходный код Matcher
в Java 11, мы обнаружим следующее дополнение, которого нет в Java 8:
/**
* Storage used by top greedy Loop node to store a specific hash set to
* keep the beginning index of the failed repetition match. The nodes
* themselves are stateless, so they rely on this field to hold state
* during a match.
*/
IntHashSet[] localsPos;
Это локальное хранилище, наряду с большим количеством другого добавленного кода, кажется, является одной из основных причин, почему конечный автомат для регулярных выражений в Java 9+ выполняется намного быстрее, чем в Java 8 и ниже.