Здесь есть много вещей, которые могут смутить. Я рассмотрю каждую из этих вещей, чтобы объяснить, почему работает алгоритм.
Матч выполняется по строке с длиной регулярного выражения, а не по фактическому номеру. Единственными реальными данными в строке являются ее длина.
\\
Двойные обратные косые черты - это просто потому, что в строковых литералах строки должны быть обратными слэшами, чтобы было ясно, что вы не избегаете чего-то другого. Я не буду показывать их в любом будущем коде в этом ответе.
(?x)
: Это позволяет расширенный режим регулярного выражения. В этом режиме пробелы, которые не являются обратными или внутри символьного класса, игнорируются, позволяя регулярному выражению разбиваться на более читаемые части со встроенными комментариями. [sarand.com].
.?
: Это будет соответствовать 0 или 1 символьным строкам. Это совпадение используется только для случаев f (0), f (1) и f (2), иначе оно будет отброшено.
|
: Это означает, что если первая попытка совместить 1 или два символа не сработала, попробуйте сопоставить все, что находится справа от нее.
(
: Это открывает первую группу (см. Далее \1
).
(\2?+
+
делает ?
притяжательным квантором. В этом случае результат заключается в том, что ?
означает использование обратной ссылки \2
, если оно определено, а средства +
не возвращаются и не пытаются использовать его, если регулярное выражение не работает с ним.
(\1|^.)
: Это будет соответствовать либо всем, что было согласовано до сих пор, либо одному персонажу. Это, конечно, означает, что первое «все, что соответствует до сих пор» - это один символ. Так как это второе регулярное выражение, оно также является новым \2
)*
: Это повторит алгоритм. Каждый раз, когда он повторяется, он будет определять новые значения для \1
и \2
. Эти значения будут равны F (n-1) и F (n-2) для текущей итерации, которая будет F (n). Каждая итерация будет добавлена к предыдущей, что означает, что у вас есть сумма F (n) от 0 до n. Попробуйте запустить алгоритм через голову для получения меньших чисел, чтобы получить эту идею.
..
: Одна точка требуется в соответствии с п (1), который не входит в сумму, во-вторых, потому, что Second Identity of Fibonacci Numbers утверждает, что сумма последовательности чисел Фибоначчи является fibonnaci число минус один.(1)
Прогулка по замене вы можете увидеть, как это будет продолжаться, чтобы добавить числа Фибоначчи до заполнения строки. Первая итерация соответствует ^.
, поэтому 1. Вторая итерация соответствует предыдущему партиальному совпадению с \2
, а также всему предыдущему матчу с \1
. Это делает два для второй итерации. Третья итерация занимает эту вторую часть матча со второй итерации (1), а также всю вторую итерацию (2). Это делает три для третьей итерации. Добавьте итерации вместе, и у вас есть сумма чисел фиб.
Было бы здорово, если бы вы опубликовали интернет-источник этого кода. –
это должно быть 0 1 1 .... но ж/е довольно круто. – progrenhard
Пример приведен ниже: http://www.polygenelubricants.com/2010/09/finding-fibonacci-numbers-using-regex.html – dcaswell