Этот ответ объясняет теоретическое ограничение того, почему регулярные выражения не являются подходящим инструментом для этой задачи.
<ч />
Регулярные выражения не могут этого сделать.
Регулярные выражения основаны на вычислительной модели, известной как Finite State Automata (FSA)
. Как видно из названия, FSA
может запомнить только текущее состояние, у него нет информации о предыдущих состояниях.
На приведенной выше диаграмме S1 и S2 - это два состояния, где S1 - начальный и конечный этап. Поэтому, если мы попробуем со строкой 0110
, переход будет выглядеть следующим образом:
0 1 1 0
-> S1 -> S2 -> S2 -> S2 ->S1
На вышеприведенных шагах, когда мы находимся во втором S2
, т.е. после анализа 01
из 0110
, FSA не имеет информации о предыдущем 0
в 01
, поскольку он может запомнить только текущее состояние и следующий входной символ.
В приведенной выше задаче нам нужно знать номер открывающей скобки; это означает, что оно должно храниться в каком-то месте. Но поскольку FSAs
не может этого сделать, регулярное выражение не может быть записано.
Однако для этой задачи можно написать алгоритм. Алгоритмы, как правило, подпадают под Pushdown Automata (PDA)
. PDA
на один уровень выше FSA
. КПК имеет дополнительный стек для хранения дополнительной информации. КПК могут быть использованы для решения вышеуказанной проблемы, потому что мы можем 'push
' открывающая скобка в стеке и 'pop
' их, когда мы встречаем закрывающую скобку. Если в конце стек пуст, то открывающая и закрывающая скобки совпадают. В противном случае нет.