文字列の中から、”(”に対応した")"を探す
14 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Mamoru Mabuchi
le 25 Août 2022
Commenté : Akira Agata
le 28 Août 2022
下記のような括弧を含む文字列があるとします。
文字列に含まれる"("に対応した")"が何文字目にあるかを調べたい場合、どのようにすれば良いでしょうか
text = "3*(A+(B+2))+5*(C+4)";
下記のように”(”が登場する位置と、対応する")"の位置を出力したいです。
ans =
3,11
6,10
15,19
0 commentaires
Réponse acceptée
交感神経優位なあかべぇ
le 27 Août 2022
Modifié(e) : 交感神経優位なあかべぇ
le 27 Août 2022
丸括弧の対応関係を取得する関数を作成してみました。
丸括弧の対応関係をひとつずつ地道に検索していくしかないのかなぁと思います。
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
1 commentaire
Akira Agata
le 28 Août 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)
disp(textBrackets)
Plus de réponses (0)
Voir également
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!