Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab中使用regexp的递归技巧_Regex_Matlab - Fatal编程技术网

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
循环可能会有所帮助。