Je pense que l'article l'explique assez bien, mais je vais également m'y essayer.
L'entrée est en unaire formulaire. 1 est 1
2 est 11
3 est 111
etc. Le zéro est une chaîne vide.
La première partie de la regex correspond à 0 et 1 comme non primaires. La deuxième partie est celle où la magie opère.
(11+?)
commence par trouver des diviseurs. Il commence par être défini comme 11
ou 2. \1
est une variable se référant à cette correspondance précédemment capturée, donc \1+
détermine si le nombre est divisible par ce diviseur. ( 111111
commence par assigner la variable à 11
et détermine ensuite que les autres 1111
est 11
répétées, donc 6 est divisible par 2).
Si le nombre n'est pas divisible par deux, le moteur de regex incrémente le diviseur. (11+?)
devient 111
et nous réessayons. Si, à un moment quelconque, la regex correspond, le nombre a un diviseur qui ne donne pas de reste, et donc le nombre ne peut pas être premier.
10 votes
C'est pas un double. Il s'agit d'une regexp différente et d'une technique différente, et elle a de meilleures réponses, en plus.
2 votes
@bmargulies : Ce est une copie. La regex est la même, étant donné les restrictions de saisie de cette question et le fait que la méthode String.matches de Java fait correspondre la regex à la chaîne entière (donc ^ et $ sont implicites), ce qu'elle fait apparemment.
1 votes
@Rog - les réponses votées là-bas ne mentionnent jamais l'unaire.
0 votes
@bmargulies : Si vous pensez pouvoir apporter une réponse meilleure ou plus complète à cette question, n'hésitez pas à le faire. J'ai marqué cette question pour la fusionner, mais la superficiel les différences dans le texte des questions signifient que les réponses doivent être modifiées (comme c'est souvent le cas), même si les questions sont identiques une fois ces différences superficielles supprimées.
0 votes
@Rog à ce stade, je vais juste faire confiance aux diamants pour fusionner intelligemment.