Ответ - нет.
Язык, который вы пытаетесь проанализировать, не regular
, это context-free
.Таким образом, вы не можете разобрать его с помощью регулярных выражений.
Если вам интересно, вот грамматика:
S->SS|e;
S->'(A);
A-> AA|(A)|w+;
Это не совсем так, поскольку вы не можете построить FSM для представленияэто верно, если вы можете рекурсивно включать скобочные структуры.
Ну, что угодно.Давайте ответим на вопрос «Как?».Пройдите строку от первого символа.Как только вы найдете дефис, начните считать скобки.Счет открытия для +1, счет закрытия для -1.Как только вы попали в закрывающую скобку с нулевым счетчиком, вставьте запятую после этой скобки.Проблема решена:
'a 'b '(d f g (1 2)) '(3 4) (a d) d
| | ||
| | |+-- counter = 0 on closing bracket, insert comma
| | +--- counter = 1
| +------- counter = 2
+-------------- start counting, counter = 1
и т. Д.