在for循环中用regexprep替换字符串?(MATLAB)

在for循环中用regexprep替换字符串?(MATLAB),regex,matlab,Regex,Matlab,在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*K

在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\u 1
通过
KS1\u 5
y(52)
y(57)

PS1\u 1
通过
PS1\u 4
y(102)
y(105)

我该怎么做?我试过用这个:

还有我的以下代码:

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
但两者似乎都没有正常工作。我不确定正则表达式


提前感谢您的帮助。

至少您需要保存
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

一些regex高手可能会想出一种方法,一次完成所有动作,但为了清晰起见,我将其分为3次传球。用于字符串的单元格数组,因此可以一次将其传递给整个数组

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
我们得到以下输出:

>> 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));'

我认为这不是
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));'