Регулярные выражения в их оригинальном виде описывают обычные языки / грамматики. Они не могут содержать вложенные структуры, так как эти языки могут быть описаны простым конечным автоматом. Упрощенно вы можете представить, что каждое слово языка растет строго слева направо (или справа налево), где повторяющиеся структуры должны быть явно определены и являются статическими.
Это означает, что никакая информация из предыдущих состояний не может быть перенесена в более поздние состояния (несколько символов далее на входе). Поэтому, если у вас есть символ w , вы не можете указать, что вход должен иметь точно такую же строку w позже в последовательности. Точно так же вы не можете гарантировать, что каждому открытому парантезу также нужен клозин-парен (поэтому сами регулярные выражения даже не являются регулярным языком и поэтому не могут быть описаны регулярными выражениями: -)).
В теоретической информатике мы работали с очень ограниченным набором операторов регулярных выражений, в основном состоящих только из последовательности, альтернативы (|) и повторения (*), все остальное можно описать этими операциями.
Однако, как правило, механизмы регулярных выражений позволяют группировать определенные подшаблоны в совпадения, на которые затем можно ссылаться или извлекать позже. Некоторые движки даже позволяют использовать такую обратную ссылку в самой строке поискового выражения, что позволяет выражению описывать не только обычный язык. Если я правильно помню, такое использование обратных ссылок может даже привести к языкам, которые не являются контекстно-свободными.
Дополнительные указатели: