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

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

Risposta accettata

交感神経優位なあかべぇ
Modificato: 交感神経優位なあかべぇ il 27 Ago 2022
丸括弧の対応関係を取得する関数を作成してみました。
丸括弧の対応関係をひとつずつ地道に検索していくしかないのかなぁと思います。
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 Commento
Akira Agata
Akira Agata il 28 Ago 2022
+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)"

Accedi per commentare.

Più risposte (0)

Categorie

Scopri di più su 文字と文字列 in Help Center e File Exchange

Prodotti


Release

R2019b

Community Treasure Hunt

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

Start Hunting!