Вы сказали, что понимаете эту часть, но чтобы подчеркнуть, сгенерированная строка имеет длину, равную указанному числу. Таким образом, строка состоит из трех символов тогда и только тогда, когда n == 3
.
.?
Первая часть регулярного выражения говорит: «любой символ, ноль или один раз». Таким образом , в принципе, есть ноль или один character-- или, за то , что я уже упоминал выше, n == 0 || n == 1
. Если у нас есть совпадение, верните отрицание этого. Это соответствует тому факту, что ноль и единица НЕ являются простыми числами.
(..+?)\\1+
Вторая часть регулярного выражения немного сложнее, полагаясь на группы и обратные ссылки. Группа - это все, что указано в скобках, которое затем будет захвачено и сохранено обработчиком регулярных выражений для дальнейшего использования. Обратная ссылка - это сопоставленная группа, которая используется позже в том же регулярном выражении.
Группа захватывает 1 персонажа, затем 1 или более персонажей. (Символ + означает один или несколько, но ТОЛЬКО предыдущего символа или группы. Таким образом, это не «два, четыре или шесть и т. Д. Символов», а скорее «два или три и т. Д.» Знак +? Похож на +, но он пытается сопоставить как можно меньше символов. + обычно пытается сожрать всю строку, если может, что в данном случае плохо, потому что это мешает работе части обратной ссылки.)
Следующая часть - это обратная ссылка: тот же набор символов (два или более) появляется снова. Указанная обратная ссылка появляется один или несколько раз.
Так. Захваченная группа соответствует натуральному количеству захваченных символов (начиная с 2). Затем указанная группа появляется некоторое натуральное число раз (также начиная с 2). Если есть совпадение, это означает, что можно найти произведение двух чисел, больших или равных 2, которые соответствуют строке длиной n ... что означает, что у вас есть составное n. Итак, снова верните отрицание успешного совпадения: n НЕ является простым.
Если совпадение не может быть найдено, то вы не можете найти произведение двух натуральных чисел, больших или равных 2 ... и у вас есть как несоответствие, так и простое число, следовательно, снова возвращается отрицание. результата матча.
Теперь вы это видите? Это невероятно сложно (и дорого с точки зрения вычислений!), Но в то же время это довольно просто, как только вы это получите. :-)
Я могу уточнить, если у вас есть дополнительные вопросы, например, о том, как на самом деле работает синтаксический анализ регулярных выражений. Но пока я стараюсь, чтобы этот ответ был простым (или настолько простым, насколько это вообще возможно).
!new String(new char[n]).matches(".?|(..+?)\\1+")
эквивалентно!((new String(new char[n])).matches(".?|(..+?)\\1+"))
.