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

14 ビュー (過去 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 日
編集済み: 交感神経優位なあかべぇ 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 件)

カテゴリ

Find more on 文字と文字列 in Help Center and File Exchange

製品


リリース

R2019b

Community Treasure Hunt

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

Start Hunting!