在Matlab中使用regexp进行递归技巧

时间:2014-03-17 18:58:44

标签: regex matlab

我尝试使用regexprep来解决问题 - 我给了一个表示函数的字符串;它包含这样的模式:'sin(arcsin(f))'其中f - 任何子串;我需要用简单的'f_2'替换它。我成功使用了regexprep,除非我面对这样的字符串:

str = 'sin(arcsin(sin(arcsin(f_2))))*x^2';
str = regexprep(str, 'sin\(arcsin\((\w*)\)\)','$1');

它返回

str =

sin(arcsin(f_2))*x^2

但我希望它是

str =

f_2*x^2

有没有办法解决它(除了带有for循环的明显解决方案)。

2 个答案:

答案 0 :(得分:1)

更改您的模式以搜索1个或更多(+)嵌套sin(arcsin(次出现:

str = 'sin(arcsin(sin(arcsin(f_2))))*x^2';
str2 = regexprep(str, '(sin\(arcsin\()+(\w*)(\)\))+','$2')

str2 =
f_2*x^2

答案 1 :(得分:1)

我无法测试这个,但我想我找到了一个表达式,你可以多次调用它来做你要求的事情;每次它将"剥离"您的等式中有一个sin(arcsin())对。一旦它停止变化,你就完成了。

(.*)sin\(arcsin\((.*(\(.*?\))*)(\)\).*$)

这是一些Matlab代码,展示了这可能如何工作:

str = 'sin(arcsin(sin(arcsin(f_2))))*x^2';
regex = (.*)sin\(arcsin\((.*(\(.*?\))*)(\)\).*$);

oldlength = 0
newlength = length(str)

while (newlength != oldlength)
  oldlength = newlength;
  str = regexprep(str, regex,'$1$2');
  newlength = length(str);
end

正如我所说 - 我无法测试这一点。如果您对此有任何问题,请告诉我。

正则表达式的演示:

http://regex101.com/r/bR9gC7