Como posso excluir faixas de espaços em branco de uma string?
Quando eu tenho
i hate extra blanks in my strings!
eu quero
i hate extra blanks in my strings!
Eu encontrei uma solução
v(find(filter([1 1], 2, v == " ") == 1)) = []
mas eu não entendo como funciona (eu tentei ler isso http://www.mathworks.de/de/help/matlab/data_analysis/filtering-data.html#bqm3i7m-3). Existe uma solução mais simples ou alguém pode explicar a solução acima?
Respostas:
3 para resposta № 1v(strfind(v, " ")) = []
Matará todos os espaços em branco, exceto os únicos ou o último espaço em branco em uma faixa de espaços em branco.
3 para resposta № 2
Um REGEX ainda mais simples:
>> str = "i hate extra blanks in my strings!";
>> regexprep(str, "s+", " ")
ans =
i hate extra blanks in my strings!
2 para resposta № 3
Uma abordagem simples seria usar 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!
Com o novo R2013a "s strjoin
, você deveria ser capaz de fazer
strjoin(p, " "); % instead of last step
2 para resposta № 4
Existem funções do MATLAB (strtrim
, deblank
, etc.) para remover espaços em branco adicionais da frente ou fim das cordas, mas, tanto quanto eu sei, não embutido para o colapso de espaços adicionais a partir do centro. Desde que nós já temos algumas regexp
acontecendo, eu vou fazer a explicação do código que você já encontrou:
Vamos olhar para o filter
parte do seu exemplo para começar. filter
trabalha em números, não em strings, então o v == " "
simplesmente converte sua string para uma série de números onde 1
é um espaço e 0
é qualquer coisa não um espaço. Podemos executar essa parte separadamente para ver o que ela faz:
v2 = filter([1 1], 2, v == " ");
O filtro em si é, basicamente, tomando a média de dois valores adjacentes ([1 1]/2
), através da corda. Isso vai deixar você com 1
s onde você tem um espaço com outro espaço antes dele e 0 ou 0.5, onde você tem um espaço com uma letra logo antes dele. Então, apenas os espaços extras retornarão 1
no filtro.
O código que envolve o código diz "localize onde o filtro retorna um e substitua essas partes da sequência por vazio" (por exemplo, remova-as). Na verdade o find
não é necessário, você poderia fazer isso diretamente com a indexação lógica:
v(filter([1 1], 2, v == " ") == 1) = [];
Outra melhoria seria usar isspace
ao invés de v == " "
, pois isto irá capturar mais tipos de espaços em branco (por ex. isspace
bate guias e outras coisas que não são " "
).
v(filter([1 1], 2, isspace(v)) == 1) = [];
Indexação lógica + = [];
é uma maneira bastante comum no MATLAB para retirardados indesejados de vários tipos. Você precisa ser cauteloso nos casos em que isso for reformular seus dados. Se você fizer isso, sua matriz originalmente quadrada se torna um vetor:
x = randi(10,[5 5]); % outputs a 5 x 5 matrix
x(x==5)=[]; % output will be 1 x n
0 para a resposta № 5
Apenas para o mudez disso:
>>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!
Eu sinto que deveria pertencer a codebox, embora ... :-)