在Matlab中我有一个表示函数的字符串。让它像那样'...sin(arcsin(f_2))...'
。我希望找到任何F的'sin(arcsin(F))'
的所有外观,并将其替换为简单的'F'
。
我不知道F是什么类型的功能。它可能是'exp'
或'cos'
或其他。
我该怎么办?没有while循环,是否有任何聪明的方法呢?
答案 0 :(得分:2)
有几种方法:
>> char(sym(str)) %// requires symbolic toolbox
>> regexprep(str, 'sin\(arcsin\(F\)\)', 'F')
>> strrep(str, 'sin(arcsin(F))', 'F')
关于regexprep
方法的好处是你可以在间距和套管方面更加灵活:
>> regexprep(str, 'sin\s*\(\s*a(rc)*sin\s*\(\s*F\s*\)\s*\)', 'F', 'ignorecase')
上面的调用将转换以下所有内容:
>> str = ' sin ( arcsin(F ) )'
>> str = 'sin(arCSin(f) )'
>> str = ' Sin (arcsin(f) ) )'
>> str = 'Sin(Asin(f)))'
等。
请注意,对于上述两种方法:str
可以是字符串的字符串或单元格数组。
<强> 修改 强>
您已指出F
可能是任何内容。这使问题复杂化。对于简单匹配,您仍然可以使用类似
>> regexprep(str, 'sin\s*\(\s*a(rc)*sin\s*\(\s*(.+)\s*\)\s*\)', '$2', 'ignorecase')
但是你必须小心,因为像
这样的事情>> str = 'acos(log( sin(arcsin( exp(x) )) * sin(x) ))'
将被错误地转换:
>> regexprep(str, 'sin\s*\(\s*a(rc)*sin\s*\(\s*(.+)\s*\)\s*\)', '$2', 'ignorecase')
ans =
acos(log( exp(x) )) * sin(x)
(注意不正确的包围)。一种解决方案是使用延迟运算符:
>> regexprep(str, 'sin\s*\(\s*a(rc)*sin\s*\(\s*(.+?)\s*\)\s*\)', '$2', 'ignorecase')
但请注意,您确实越过了正则表达式可以(或应该)的边界。不会所有可能的情况都会以这种方式成功处理...另请参阅this legendary answer
到目前为止,最好的方法是防止这些字符串在第一个位置生成。我怀疑一个简单的sym/simplify
会消除这个问题。