如何从字符串中删除空白条纹?
当我有
时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)。有没有更简单的解决方案或有人可以解释上述解决方案?
答案 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函数(strtrim
,deblank
等)用于从字符串的前端或末尾删除其他空格,但据我所知,没有内置用于从中心折叠其他空格。既然我们已经有了一些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,但是......: - )