在Matlab中替换子串

时间:2014-03-17 13:24:21

标签: matlab replace substring

在Matlab中我有一个表示函数的字符串。让它像那样'...sin(arcsin(f_2))...'。我希望找到任何F的'sin(arcsin(F))'的所有外观,并将其替换为简单的'F'

我不知道F是什么类型的功能。它可能是'exp''cos'或其他。

我该怎么办?没有while循环,是否有任何聪明的方法呢?

1 个答案:

答案 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会消除这个问题。