Как этот regex находит начала? [дубликат]

Возможный дубликат:
Как определить, является ли число началом с regex?

Эта страница утверждает, что это регулярное выражение обнаруживает непростые числа (и контрпримером: начала):

/^1?$|^(11+?)\1+$/

Как это находит начала?

56
задан Community 23 May 2017 в 11:54
поделиться

2 ответа

Я думаю, что статья объясняет это довольно хорошо, но я тоже попробую свои силы.

Ввод осуществляется в унарной форме. 1 - это 1, 2 - 11, 3 - 111 и т.д. Ноль - это пустая строка.

Первая часть регекса соответствует 0 и 1 как нецелым. Во второй части происходит волшебство.

(11+?) начинается с поиска делителей. Он начинается с определения 11, или 2. \1 - это переменная, относящаяся к ранее взятому совпадению, поэтому \1+ определяет, делится ли число на этот делитель. (111111 начинает с присвоения переменной 11, а затем определяет, что оставшееся 1111 повторяет 11, поэтому 6 делится на 2.)

Если число не делится на два, механизм regex увеличивает делитель. (11+?) становится 111, и мы повторяем попытку. Если в какой-либо точке regex совпадает, то число имеет делитель, который не дает остатка, и поэтому число не может быть простым.

90
ответ дан 26 November 2019 в 17:24
поделиться

Мне потребовалась минута, чтобы понять, что это предназначено для чисел в базе-1 (унарная?)

Несколько человек в этом обсуждении икомбинатора объясняют это довольно хорошо. На самом деле эти объяснения более лаконичны, чем я думаю, что я могу получить, поэтому я оставлю это по ссылке.

6
ответ дан 26 November 2019 в 17:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: