2016-03-23 18 views
2

私はMatlabでプログラムの検索と置き換えに多くの問題を抱えてきました。私はここでMWEを再現しました。 forループ内で文字列をregexprepに置き換える? (MATLAB)

は、私が 'BaseJac3.txt' と呼ばれるテキストファイルに次のコードを持って言う:私は y(2)

S1_2を交換する必要が

x2 = -S1_2*(r1+a*K+a*P)+k*KS1_1+d*(PS1_1+KS1_2); 
x3 = -S1_3*(r1+a*K+a*P)+k*KS1_2+d*(PS1_2+KS1_3); 
x4 = -S1_4*(r1+a*K+a*P)+k*KS1_3+d*(PS1_3+KS1_4); 
x5 = -S1_5*(r2+a*K+a*P)+k*KS1_4+d*(PS1_4+KS1_5); 

、...、S1_5y(5)とします。

y(105)

y(102)y(52)KS1_5

KS1_1PS1_4PS1_1

y(57)には

私はこれをどのように行うことができますか? http://www.mathworks.com/matlabcentral/fileexchange/42877-find-and-replace-in-files

とも私の次のコード:私はこれを使って試してみた

text1 = fileread('BaseJac3.txt'); 

for k = 1:4 
    regexprep(text1,['PS1_' num2str(k)],['y(' num2str(k+101) ')']); 
end 
for k = 1:5 
    regexprep(text1,['KS1_' num2str(k)],['y(' num2str(k+51) ')']); 
end 
for k = 2:5 
    regexprep(text1,['S1_' num2str(k)],['y(' num2str(k) ')']); 
end 

をどちらも正常に動作しているようだありません。私は正規表現についてはわかりません。

ご協力いただきありがとうございます。

+1

を。むしろ、その文法でループ内で['strrep'](http://www.mathworks.com/help/matlab/ref/strrep.html)を試すべきです。私はあなたがループなしでこれを行うために正規表現を使用できるはずだと思います。 – Dan

答えて

2

いくつかの正規表現の達人は、おそらくすべてのワンショットでこれを行う方法を働くことができますが、わかりやすくするために、私は分割しましたそれを3回通過する。 regexprepは文字列のセル配列に作用するので、配列全体を一度に渡すことができます。

function newstr = testcode(str) 
helper = @(x,y) num2str(str2double(x) + y); % Generate anonymous function for our dynamic regexrep expression 

pass1 = regexprep(str, '(?<!(K|P))S1_(\d*)', 'y($1)'); %S1 
pass2 = regexprep(pass1, 'KS1_(\d*)', 'y(${helper($1,51)})'); % KS1 
pass3 = regexprep(pass2, 'PS1_(\d*)', 'y(${helper($1,101)})'); % PS1 
newstr = pass3; 
end 

私はここでやったことは、出力をフォーマットするregexprepTokensDynamic Expressionsを利用します。

パス1はS1で動作し、lookbehind assertionを使用してKS1PS1を無視します。式はS1_に続く数字と一致し、y()のトークンとして使用されます。

パス2とパス3は、KS1PS1で動作します。これらはマッチに同じトークン・アプローチを使用しますが、置換のための動的式も使用します。これにより、文字列を返すMATLAB関数にトークンを渡し、その文字列を置換文字として使用することができます。私は、ヘルパー無名関数helperを定義して、目的のインデックスオフセットを処理しました。次の入力で

str = {'x2 = -S1_2*(r1+a*K+a*P)+k*KS1_1+d*(PS1_1+KS1_2);'; ... 
     'x3 = -S1_3*(r1+a*K+a*P)+k*KS1_2+d*(PS1_2+KS1_3);'; ... 
     'x4 = -S1_4*(r1+a*K+a*P)+k*KS1_3+d*(PS1_3+KS1_4);'; ... 
     'x5 = -S1_5*(r2+a*K+a*P)+k*KS1_4+d*(PS1_4+KS1_5);' ... 
     }; 

私たちは、次のような出力を得る:私はそれがどのように `regexprep`作品だとは思わない

>> A = testcode(str) 

A = 

    'x2 = -y(2)*(r1+a*K+a*P)+k*y(52)+d*(y(102)+y(53));' 
    'x3 = -y(3)*(r1+a*K+a*P)+k*y(53)+d*(y(103)+y(54));' 
    'x4 = -y(4)*(r1+a*K+a*P)+k*y(54)+d*(y(104)+y(55));' 
    'x5 = -y(5)*(r2+a*K+a*P)+k*y(55)+d*(y(105)+y(56));' 
0

非常に少なくとも、あなたはregexprepコマンドからの出力を保存する必要があります。

text1 = fileread('BaseJac3.txt'); 

for k = 1:4 
    text1 = regexprep(text1,['PS1_' num2str(k)],['y(' num2str(k+101) ')']); 
end 
for k = 1:5 
    text1 = regexprep(text1,['KS1_' num2str(k)],['y(' num2str(k+51) ')']); 
end 
for k = 2:5 
    text1 = regexprep(text1,['S1_' num2str(k)],['y(' num2str(k) ')']); 
end 
関連する問題