(7)

родолжение кэтот вопрос.

Посмотрите на этот шаблон:

(o(?1)?o)

Это соответствует любой последовательностиo длиной 2nс n ≥ 1.
Это работает, см. Regex101.com (добавлены границы слов для лучшей демонстрации).
Вопрос в том:Зачем?

Далее описание строки (соответствует или нет) будет просто жирным числом или жирным шрифтом, который описывает длину, например2n.

Разбитый (с добавленными пробелами):

( o (?1)? o )
(           ) # Capture group 1
  o       o   # Matches an o each at the start and the end of the group
              # -> the pattern matches from the outside to the inside.
    (?1)?     # Again the regex of group 1, or nothing.
              # -> Again one 'o' at the start and one at the end. Or nothing.

Я не понимаю, почему это не соответствует2n, но2nпотому что я бы описал шаблон как * неопределенное числоo o, сложенные друг в друга.

Визуализация:

Нет рекурсии,2 это совпадение:

oo

Одна рекурсия,4 это совпадение:

o  o
 oo

Пока все просто.

Две рекурсии. Очевидно, неправильно, потому что шаблон не совпадает6:

o    o
 o  o
  oo

Но почему? Кажется, чтобы соответствовать шаблону.

Я пришел к выводу, что это не просто шаблон, который повторяется, потому что в противном случае6 будет соответствовать.

Но согласноregular-expressions.info:

(?P<name>[abc])(?1)(?P>name) соответствует трем буквам(?P<name>[abc])[abc][abc] делает.

а также

[abc])(?1){3} [...] эквивалентно([abc])[abc]{3}

Таким образом, кажется, что это просто повторное сопоставление кода регулярного выражения без информации о предыдущем совпадении группы захвата.

Может кто-то объяснить и, возможно, представить, почему этот шаблон соответствует2n и ничего больше?

Редактировать:

Это было упомянуто в комментариях:

Я сомневаюсь, что ссылка на группу захвата внутри себя - фактически поддерживаемый случай.

регулярные выражения упоминает технику:

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

Ответы на вопрос(2)

Ваш ответ на вопрос