Возможный дубликат:
Как определить, является ли число началом с regex?Эта страница утверждает, что это регулярное выражение обнаруживает непростые числа (и контрпримером: начала):
/^1?$|^(11+?)\1+$/
Как это находит начала?
Я думаю, что статья объясняет это довольно хорошо, но я тоже попробую свои силы.
Ввод осуществляется в унарной форме. 1 - это 1
, 2 - 11
, 3 - 111
и т.д. Ноль - это пустая строка.
Первая часть регекса соответствует 0 и 1 как нецелым. Во второй части происходит волшебство.
(11+?)
начинается с поиска делителей. Он начинается с определения 11
, или 2. \1
- это переменная, относящаяся к ранее взятому совпадению, поэтому \1+
определяет, делится ли число на этот делитель. (111111
начинает с присвоения переменной 11
, а затем определяет, что оставшееся 1111
повторяет 11
, поэтому 6 делится на 2.)
Если число не делится на два, механизм regex увеличивает делитель. (11+?)
становится 111
, и мы повторяем попытку. Если в какой-либо точке regex совпадает, то число имеет делитель, который не дает остатка, и поэтому число не может быть простым.
Мне потребовалась минута, чтобы понять, что это предназначено для чисел в базе-1 (унарная?)
Несколько человек в этом обсуждении икомбинатора объясняют это довольно хорошо. На самом деле эти объяснения более лаконичны, чем я думаю, что я могу получить, поэтому я оставлю это по ссылке.