Я не знаю RegEx, поэтому я сделаю это по-другому. И это применимо, только если строка не является частичной повторяющейся строкой, то есть "xbcabbaabbaabbaxx"
Сначала вы берете входную строку и находите факторы размера строки. Простое число будет означать, что нет повторяющихся шаблонов, так как повторяющийся шаблон подразумевает кратное по крайней мере 2 длины строки шаблона.
Благодаря Tot Zam: Нахождение коэффициентов для данного целого числа
public ArrayList<Integer> findFactors(int num) {
ArrayList<Integer> factors = new ArrayList<Integer>();
// Skip two if the number is odd
int incrementer = num % 2 == 0 ? 1 : 2;
for (int i = 1; i <= Math.sqrt(num); i += incrementer) {
// If there is no remainder, then the number is a factor.
if (num % i == 0) {
factors.add(i);
// Skip duplicates
if (i != num / i) {
factors.add(num / i);
}
}
}
// Sort the list of factors
Collections.sort(factors);
return factors;
}
Как только вы найдете коэффициенты числа, в вашем случае 16 (результат 1,2,4,8,16) и исключая наибольший коэффициент (который сам по себе), вы можете теперь создать цикл и выполнить итерацию подстроки строки. Вы проверяете для каждого значения его предыдущее значение и проверяете, пока не получите правильное значение, используя continue
Например, набросок:
boolean isRepeatingPattern = false;
for (Integer factor : factors) {
int iterations = stringSize / factor;
String previousSubstring = stringParam.substring(0, factor);
for (int i = 1; i < iterations; i++) {
int index = i * factor;
if (previousSubstring != stringParam.substring(index, index + factor)) break;
if (i == iterations - 1) repeatingPattern = true;
}
}