Matlab中使用regexp的递归技巧
我试着用Matlab中使用regexp的递归技巧,regex,matlab,Regex,Matlab,我试着用regexprep来解决一个问题——给我一个字符串,它代表一个函数;它包含如下模式:'sin(arcin(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 但我
regexprep
来解决一个问题——给我一个字符串,它代表一个函数;它包含如下模式:'sin(arcin(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循环的明显解决方案)。更改您的模式以搜索1个或多个嵌套的
sin(arcin(
出现次数:
str = 'sin(arcsin(sin(arcsin(f_2))))*x^2';
str2 = regexprep(str, '(sin\(arcsin\()+(\w*)(\)\))+','$2')
str2 =
f_2*x^2
我无法测试这一点,但我想我找到了一个表达式,可以多次调用它来实现您的要求;每次它都会从您的等式中“剥离”一个
sin(arcin())
对。一旦它停止更改,您就完成了
(.*)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
正如我所说的,我无法测试这个。如果你对此有任何问题,请告诉我
正则表达式的演示:
假设括号始终与sin/arcin匹配,而sin/arcin可能不为真。例如:
foo(bar(sin(arcin(x)))
被缩减为foo(bar)(x
不再有效。@GigaWatt很好。是否要使令牌1的出现次数与令牌3的出现次数匹配?据我所知,没有。我仍然认为最好的方法是在while循环中进行单个搜索替换。如果替换后字符串相同,则处理完成。如果使用recursive正则表达式,它看起来是这样的:sin\(arcin\((?:(\w*))(?R))\)
(未经测试,我不确定Matlab是否支持递归正则表达式)为什么您会反对使用循环结构?使用while循环之类的东西会使您的代码意图更加清晰。如果输入是sin(arcin(foo(sin)(arcin(bar ')))),您希望发生什么
?我想一旦我们知道了这一点,答案就会变得更清楚。@GigaWatt,我并不拒绝使用loop。我感兴趣的是,是否有可能不使用loop解决问题。@Floris,答案是foo(bar)。其他可能的变体是什么?谢谢你的回答,但我在最后一句中注意到,我已经知道了while的解决方案-loop@restrest-您的表达式不适用于sin(arcin(foo(sin)(arcin(bar)())))
或甚至只是sin(arcin(foo(bar)))
…因此我认为您需要一个更好的表达式。我意识到您知道while
循环可能会有所帮助。