Как это регулярное выражение находит треугольные числа?

Это часть серии образовательных регулярных выражений. Это краткое введение в понятие вложенных ссылок.

Первые несколько треугольных чисел :

 1 = 1
 3 = 1 + 2
 6 = 1 + 2 + 3
10 = 1 + 2 + 3 + 4
15 = 1 + 2 + 3 + 4 + 5

Есть много способов проверить, является ли число треугольным. Есть эта интересная техника, которая использует регулярные выражения следующим образом:

  • Учитывая n , мы сначала создаем строку длины n , заполненную тем же символом
  • Затем мы сопоставляем эту строку против шаблона ^ (\ 1. | ^.) + $
    • n является треугольным тогда и только тогда, когда этот шаблон соответствует строке

Вот несколько фрагментов, показывающих, что это работает на нескольких языках :

PHP (на ideone.com)

$r = '/^(\1.|^.)+$/';

foreach (range(0,50) as $n) {
  if (preg_match($r, str_repeat('o', $n))) {
     print("$n ");
  }
}

Java (на ideone.com)

for (int n = 0; n <= 50; n++) {
    String s = new String(new char[n]);
    if (s.matches("(\\1.|^.)+")) {
        System.out.print(n + " ");
    }
}

C # (на ideone.com)

Regex r = new Regex(@"^(\1.|^.)+$");

for (int n = 0; n <= 50; n++) {
    if (r.IsMatch("".PadLeft(n))) {
       Console.Write("{0} ", n);
    }
}

Итак, это регулярное выражение работает, но может кто-нибудь объяснить, как?

Подобные вопросы

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