Часть серии учебных статей регулярных выражений, это нежное введение в концепцию вложенных ссылок.
Первые несколько треугольных номеров:
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 + " ");
}
}
С# (на ideone.com)
Regex r = new Regex(@"^(\1.|^.)+$");
for (int n = 0; n <= 50; n++) {
if (r.IsMatch("".PadLeft(n))) {
Console.Write("{0} ", n);
}
}
Итак, это регулярное выражение, похоже, работает, но может ли кто-нибудь объяснить, как?