/ / matlab exclui faixas de espaços em branco de string - matlab, formatando

matlab excluir faixas de espaços em branco de string - matlab, formatação

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 № 1
v(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 1s 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 ... :-)