文字列の中から、”(”に対応した")"を探す

조회 수: 23 (최근 30일)
Mamoru Mabuchi
Mamoru Mabuchi 2022년 8월 25일
댓글: Akira Agata 2022년 8월 28일
下記のような括弧を含む文字列があるとします。
文字列に含まれる"("に対応した")"が何文字目にあるかを調べたい場合、どのようにすれば良いでしょうか
text = "3*(A+(B+2))+5*(C+4)";
下記のように”(”が登場する位置と、対応する")"の位置を出力したいです。
ans =
3,11
6,10
15,19

채택된 답변

交感神経優位なあかべぇ
편집: 交感神経優位なあかべぇ 2022년 8월 27일
丸括弧の対応関係を取得する関数を作成してみました。
丸括弧の対応関係をひとつずつ地道に検索していくしかないのかなぁと思います。
text = "3*(A+(B+2))+5*(C+4)";
bracketsList = GetBracketsPatternList(text);
disp(bracketsList);
3 11 6 10 15 19
% 丸括弧の対応関係リストを取得します。
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
  댓글 수: 1
Akira Agata
Akira Agata 2022년 8월 28일
+1
正規表現を使っても同じように検出することができます。
以下はその一例です。
% サンプルテキスト
text = "3*(A+(B+2))+5*(C+4)";
% 準備
textOriginal = text;
textBrackets = [];
nPos = [];
% 正規表現を使って文字列 '([丸括弧以外の文字])' を地道に検出
while contains(text, '(')
% 対象を検出
[cTmp, n1, n2] =...
regexp(text,'\([^\(\)]+\)','match','once','start','end');
% 検出した文字列とポジションを記録
textBrackets = [textBrackets; extractBetween(textOriginal, n1, n2)];
nPos = [nPos; n1, n2];
% 検出した文字列を同じ長さの 'xxxx...' で置き換え
len = strlength(cTmp);
pat = repelem('x', 1, len);
text = replace(text, cTmp, pat);
end
% 結果を表示
disp(nPos)
6 10 3 11 15 19
disp(textBrackets)
"(B+2)" "(A+(B+2))" "(C+4)"

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 文字と文字列에 대해 자세히 알아보기

제품


릴리스

R2019b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!