Это звучит грязно, но, возможно, стоит взглянуть на класс Pattern в исходном коде Java .
Быстро посмотрев, кажется, что это 'normalize ()' - это заданное регулярное выражение (строка 1441), которое может превратить выражение в нечто более предсказуемое. Я думаю, что отражение может быть использовано, чтобы задействовать некоторые частные ресурсы класса (будьте осторожны!). Вполне возможно, что во время токенизации шаблона регулярных выражений имеются конкретные указания, если он достиг какого-то «многозначного» элемента в шаблоне.
Обновление
После более тщательного изучения в области действия пакета есть некоторые данные, которые можно использовать для использования работы токенизатора Pattern для обхода узлов регулярного выражения и проверки наличия многосимвольных узлов.
После компиляции регулярного выражения итерируйте скомпилированные «узлы», начиная с Pattern.root. Начиная со строки 3034 класса, существуют обобщенные типы узлов. Например, класс Pattern.All является множественным соответствием, в то время как Pattern.SingleI или Pattern.SliceI являются одинаковыми и так далее.
Все эти классы токенов, по-видимому, находятся в области видимости пакета, поэтому должна быть возможность сделать это без использования отражения, а вместо этого создать класс java.util.regex.PatternHelper для выполнения работы.
Надеюсь, это поможет.