(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 и ничего больше?
Редактировать:
Это было упомянуто в комментариях:
Я сомневаюсь, что ссылка на группу захвата внутри себя - фактически поддерживаемый случай.
регулярные выражения упоминает технику:
Если вы поместите вызов внутри группы, которую он вызывает, у вас будет рекурсивная группа захвата.