在 Matlab 中,我在程序化查找和替换方面遇到了很多麻烦。我在这里复制了 MWE。
假设我在名为“BaseJac3.txt”的文本文件中有以下代码:
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_2
与 y(2)
、...、S1_5
与 y(5)
;
KS1_1
到 KS1_5
,其中 y(52)
到 y(57)
PS1_1
到 PS1_4
,其中 y(102)
到 y(105)
我该怎么做?我尝试过使用这个: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
但似乎都无法正常工作。我不确定正则表达式。
提前感谢您的帮助。
最佳答案
一些正则表达式高手可能可以想出一种方法一次性完成这一切,但为了清楚起见,我将其分为 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
我在这里所做的是利用regexprep
's Tokens和 Dynamic Expressions格式化输出。
channel 1 适用于 S1
,并使用 lookbehind assertion忽略 KS1
和 PS1
。该表达式匹配 S1_
后面的数字,并将其用作 y()
的标记。
第 2 轮和第 3 轮适用于 KS1
和 PS1
。它们使用相同的标记方法进行匹配,但也使用动态表达式进行替换。这些允许我们将标记传递给任何返回字符串的 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);' ...
};
我们得到以下输出:
>> 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));'
关于regex - 在 for 循环中用 regexprep 替换字符串? (MATLAB),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36181662/