丸括弧の対応関係を取得する関数を作成してみました。
丸括弧の対応関係をひとつずつ地道に検索していくしかないのかなぁと思います。
text = "3*(A+(B+2))+5*(C+4)";
bracketsList = GetBracketsPatternList(text);
disp(bracketsList);
% 丸括弧の対応関係リストを取得します。
function bracketsList = GetBracketsPatternList(text)
openBrackets = strfind(text, '(');
closeBrackets = strfind(text, ')');
if length(openBrackets) ~= length(closeBrackets)
error(' ( と ) の数があっていません。');
end
bracketsList = zeros(length(openBrackets), 2);% 括弧対応関係リストの初期化
for closeIdx = 1 : length(closeBrackets)% 閉じ括弧を基準に開き括弧を検索
findOpenBrackets = openBrackets(openBrackets < closeBrackets(closeIdx));% 検索している閉じ括弧より前に位置する開き括弧の位置を全て取得
if isempty(findOpenBrackets)
error(' ( と )の対応関係に誤りがあります。');
end
findIdx = find(~ismember(findOpenBrackets, bracketsList(:,1)), 1, 'last');% すでに発見されている開き括弧を除外し、最も後方に位置する開き括弧を取得
if isempty(findIdx)
error(' ( と )の対応関係に誤りがあります。');
else
bracketsList(closeIdx, :) = [findOpenBrackets(findIdx), closeBrackets(closeIdx)];
end
end
% 括弧対応関係リストを開き括弧を基準に昇順にする。
[~, sortIdx] = sort(bracketsList(:,1));
bracketsList = bracketsList(sortIdx, :);
end