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

时间:2016-03-23 15:01:03

标签: 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*KS1_4+d*(PS1_4+KS1_5);

我需要替换

S1_2y(2),...,S1_5y(5);

KS1_1KS1_5 y(52)y(57)

PS1_1PS1_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

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

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

一些正则表达式的高手可能会在一次拍摄中完成这一切,但为了清晰起见,我将其分为3遍。 regexprep适用于字符串的单元格数组,因此您可以立即将整个数组传递给它。

list

我在这里所做的是利用[:n]的{​​{3}}和Tokens格式化输出。

Pass 1适用于Class test { private List<AdminRequest> _AdminRequestSet; public void addAdminRequest(AdminRequest param) { if (_AdminRequestSet == null) { _AdminRequestSet = new Vector<AdminRequest>(); } this._AdminRequestSet.add(param); } public void removeAdminRequest(AdminRequest param) { this._AdminRequestSet.remove(param); } public List<AdminRequest> getAdminRequestSet() { return this._AdminRequestSet; } public void clearAdminRequest() { if (_AdminRequestSet == null) { return; } _AdminRequestSet.clear(); } } ,并使用Dynamic Expressions忽略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。表达式与S1后面的数字匹配,并将其用作KS1的标记。

第2和第3张适用于PS1S1_。它们使用相同的令牌方法进行匹配,但也使用动态表达式进行替换。这些允许我们将令牌传递给任何返回字符串的MATLAB函数,并使用该字符串作为替换。我已经定义了一个帮助程序匿名函数y()来处理所需的索引偏移量。

使用以下输入:

KS1

我们得到以下输出:

PS1

答案 1 :(得分: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