Creo que el artículo lo explica bastante bien, pero voy a intentarlo también.
La entrada está en unary formulario. 1 es 1
, 2 es 11
, 3 es 111
, etc. Zero es una cadena vacía.
La primera parte de la expresión regular coincide con 0 y 1 como no primo. El segundo es donde entra la magia.
(11+?)
comienza por encontrar divisores. Comienza definiéndose como 11
, o 2. \1
es una variable que se refiere a la coincidencia capturada anteriormente, por lo que \1+
determina si el número es divisible por ese divisor. (111111
se inicia mediante la asignación de la variable a 11
, y luego determina que el 1111
es 11
restante repiten, por lo 6 es divisible por 2.)
Si el número no es divisible por dos, el motor de expresiones regulares incrementa el divisor. (11+?)
se convierte en 111
, y lo intentamos de nuevo. Si en algún momento la expresión regular coincide, el número tiene un divisor que no produce ningún resto, por lo que el número no puede ser primo.
Esto es ** no ** un dup. Es una expresión regular diferente y una técnica diferente, y tiene mejores respuestas, para arrancar. – bmargulies
@bmargulies: Este * es * un tonto. La expresión regular es la misma, dadas las restricciones de entrada en esta pregunta y que el método String.matches de Java coincide con la expresión regular frente a toda la cadena (por lo tanto^y $ están implícitos), lo que aparentemente hace. –
@Rog - las respuestas vertidas por encima nunca mencionan unary. – bmargulies