Это часть серии образовательных регулярных выражений. Это краткое введение в понятие вложенных ссылок.
Первые несколько треугольных чисел :
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); } }
Итак, это регулярное выражение работает, но может кто-нибудь объяснить, как?
Подобные вопросы