Если ввод допустим , мы можем использовать некоторые избыточные ограничения такого языка, чтобы добавить соответствующие скобки.Но это на самом деле больше с помощью «трюков».Я действительно советую использовать более сложный инструмент, такой как push-автомат (так что синтаксический анализатор ).
Ну, здесь есть кое-что, что мы можем заметить:в том случае, если следующий символ - число или последовательность двойных кавычек, за которыми следует число, все остальные двойные кавычки.
Таким образом, мы в основном можем сделать это с помощью двух регулярных выражений:
- первая заменяет все двойные кавычки, за которыми следуют ноль или более двойных кавычек, за которыми следует число;и
- затем заменить все оставшиеся двойные кавычки (на самом деле это просто замена символов, поэтому регулярное выражение не требуется).
Но этот трюк только работает, если оригиналввод действителен.Если он содержит двойные кавычки вокруг операторов, например "+"
, то он может давать совершенно разные результаты.
В Python, например, мы можем использовать:
from re import sub
def add_brackets(text):
return sub(r'["](?=\"*[(\d])', '(', text).replace('"', ')')
Это тогда дает нам:
>>> add_brackets('"1+""2*3"*4"+"5*6""')
'(1+((2*3)*4)+(5*6))'
Таким образом, здесь это работает, потому что мы рассматриваем только числа и операторы.Если бы мы добавили переменные, это все равно работало бы, но если бы мы добавили более сложные элементы, такие как функции, тогда проблема усложняется.
"Рекурсивные языки" (хорошо, языки, в которых определенные элементы могут могут определяется в терминах самого себя), однако лучше разбирается с помощью инструмента, сконструированного для этого, автомат с нажатием .
прокачка леммы для обычных языков показывает, что такие языки, как ( n ) n (язык, содержащий строки с несколькими открывающими символамискобки, за которыми следует такое же количество закрывающих скобок), нельзя проверять с помощью регулярных выражений.Язык, который вы описываете здесь, является примером этого.Так что это регулярное выражение не способно подтвердить это.Некоторые языки программирования, такие как Perl , имеют расширенные регулярные выражения, так что они могут проверять балансировочные скобки .Это не регулярные выражения, по крайней мере, не такие, как определено Stephen Kleene .