【问题标题】:Replacing strings with regexprep inside a for loop? (MATLAB)在for循环中用regexprep替换字符串? (MATLAB)
【发布时间】:2016-03-23 23:56:41
【问题描述】:

我在 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_2y(2), ... , S1_5y(5);

KS1_1KS1_5y(52)y(57)

PS1_1PS1_4y(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

但似乎都没有正常工作。我不确定正则表达式。

提前感谢您的帮助。

【问题讨论】:

  • 我不认为regexprep 是这样工作的。您应该使用该语法在循环中尝试strrep。我认为您应该能够使用正则表达式来执行此操作而无需循环。

标签: regex matlab


【解决方案1】:

一些正则表达式高手可能会想出一种方法来一次性完成所有这些,但为了清楚起见,我将其分为 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 来格式化输出。

Pass 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);' ...
       };

我们得到以下输出:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-14
      • 1970-01-01
      相关资源
      最近更新 更多