matlab从字符串中删除空白条纹

时间:2014-06-06 10:49:49

标签: matlab formatting

如何从字符串中删除空白条纹?

当我有

i   hate  extra blanks     in my strings!

我想要

i hate extra blanks in my strings!

我找到了解决方案

v(find(filter([1 1], 2, v == ' ') == 1)) = []

但我不明白它是如何工作的(我试着读这个http://www.mathworks.de/de/help/matlab/data_analysis/filtering-data.html#bqm3i7m-3)。有没有更简单的解决方案或有人可以解释上述解决方案?

5 个答案:

答案 0 :(得分:3)

更简单的REGEX:

>> str = 'i   hate  extra blanks     in my strings!';
>> regexprep(str, '\s+', ' ')
ans =
i hate extra blanks in my strings!

答案 1 :(得分:3)

v(strfind(v, '  ')) = []

将杀死所有空白,除了单个空格或空格连续的最后一个空格。

答案 2 :(得分:2)

一种简单的方法是使用regexp

>> v='i   hate  extra blanks     in my strings!';
>> p=regexp(v, '\s+', 'split');    % Split Using regex pattern more or more space
>> [p{1} sprintf(' %s', p{2:end})] % Form the new array of chars

ans =

i hate extra blanks in my strings!

使用新的R2013a&#39> strjoin ,你应该可以做到

strjoin(p, ' '); % instead of last step

答案 3 :(得分:2)

有MATLAB函数(strtrimdeblank等)用于从字符串的前端或末尾删除其他空格,但据我所知,没有内置用于从中心折叠其他空格。既然我们已经有了一些regexp,我会解释你已经找到的代码:

让我们看一下你的例子的filter部分。 filter适用于数字,而不是字符串,因此v == ' '只会将您的字符串转换为一系列数字,其中1是空格而0不是空格。我们可以单独运行这个部分来看它的作用:

v2 =  filter([1 1], 2, v == ' ');

过滤器本身基本上取两个相邻值([1 1]/2)的平均值,直到字符串。这将留下1 s,其中你有一个空格,前面有另一个空格,0或0.5,你有一个空格,前面有一个字母。因此,只有额外的空格才会在过滤器中返回1

代码环绕代码说“找到过滤器返回一个的位置,并将字符串的那些部分替换为空”(例如删除它们)。实际上find不是必需的,您可以使用逻辑索引直接执行此操作:

v(filter([1 1], 2, v == ' ') == 1) = [];

另一个改进是使用isspace而不是v == ' ',因为这会捕获更多类型的空白(例如isspace点击标签和其他不是{{1}的标签})。

' '

逻辑索引+ v(filter([1 1], 2, isspace(v)) == 1) = []; 是MATLAB中一种非常常见的方法,用于去除各种类型的不需要的数据。如果这会重塑您的数据,您必须小心谨慎 - 例如如果你这样做,你原来的方形矩阵就变成了一个矢量:

= [];

答案 4 :(得分:0)

仅适用于 dumbness

>>v='i   hate  extra blanks     in my strings!';
>>while(~strcmp(v, strrep(v, '  ',' '))), v=strrep(v,'  ',' '); end;                                                                                                                                                                                                                                                                                   v = 'i love wasting processor cycles!';
>>v

v =

i love wasting processor cycles!

我认为它应该属于codeboxing,但是......: - )