Digamos que eu tenha uma string como:
"Hello how are you doing?"
Eu gostaria de uma função que transforma vários espaços em um espaço.
Então, eu obteria:
"Hello how are you doing?"
Eu sei que poderia usar regex ou chamar
string s = "Hello how are you doing?".replace(" "," ");
Mas eu teria que chamá-lo várias vezes para garantir que todos os espaços em branco sequenciais sejam substituídos por apenas um.
Já existe um método integrado para isso?
c#
string
whitespace
Matt
fonte
fonte
Respostas:
fonte
Esta pergunta não é tão simples quanto outros pôsteres fizeram parecer (e como eu originalmente acreditava que fosse) - porque a pergunta não é tão precisa quanto deveria ser.
Há uma diferença entre "espaço" e "espaço em branco". Se você quer dizer apenas espaços, deve usar um regex de
" {2,}"
. Se você quer dizer qualquer espaço em branco, isso é diferente. Todos os espaços em branco devem ser convertidos em espaços? O que deve acontecer com o espaço no início e no fim?Para o benchmark abaixo, presumi que você só se preocupa com espaços e não quer fazer nada com espaços individuais, mesmo no início e no final.
Observe que a correção quase sempre é mais importante do que o desempenho. O fato de que a solução Dividir / Juntar remove qualquer espaço em branco à esquerda / à direita (mesmo apenas espaços simples) é incorreto no que diz respeito aos seus requisitos especificados (que podem estar incompletos, é claro).
O benchmark usa MiniBench .
Alguns testes:
Aqui, o primeiro número é o número de iterações, o segundo é o tempo gasto e o terceiro é uma pontuação em escala com 1.0 sendo o melhor.
Isso mostra que em pelo menos alguns casos (incluindo este) uma expressão regular pode superar a solução Dividir / Juntar, às vezes por uma margem muito significativa.
No entanto, se você mudar para um "todos os espaços" exigência, em seguida, do Grupo / Junte- se parecem ganhar. Como tantas vezes acontece, o diabo está nos detalhes ...
fonte
Um expressoin regular seria a maneira mais fácil. Se você escrever o regex da maneira correta, não precisará de várias chamadas.
Altere para este:
fonte
@"\s{2,}"
é que ele não consegue substituir guias simples e outros caracteres de espaço Unicode por um espaço. Se você for substituir 2 guias por um espaço, provavelmente deverá substituir 1 guia por um espaço.@"\s+"
vai fazer isso por você.Embora as respostas existentes sejam boas, gostaria de apontar uma abordagem que não funciona:
Isso pode ficar em loop para sempre. Alguém se importa em adivinhar por quê? (Eu só descobri isso quando foi perguntado como uma pergunta de newsgroup alguns anos atrás ... alguém realmente encontrou isso como um problema.)
fonte
Como já apontado, isso é feito facilmente por uma expressão regular. Vou apenas acrescentar que você pode querer adicionar um .trim () para se livrar dos espaços em branco à esquerda / à direita.
fonte
Aqui está a solução com a qual trabalho. Sem RegEx e String.Split.
então você pode:
fonte
Um removedor de espaço em branco extra rápido ... Este é o mais rápido e é baseado na cópia no local de Felipe Machado.
Os benchmarks ...
InPlaceCharArraySpaceOnly por Felipe Machado no CodeProject 2015 e modificado por Sunsetquest para remoção de vários espaços. Tempo: 3,75 carrapatos
InPlaceCharArray de Felipe Machado 2015 e ligeiramente modificado por Sunsetquest para remoção de vários espaços. Time 6,50 Ticks (também suporta guias)
SplitAndJoinOnSpace de Jon Skeet . Tempo: 13,25 Carrapatos
StringBuilder por fubo Tempo: 13,5 Ticks (também oferece suporte a guias)
Regex com compilação de Jon Skeet . Tempo: 17 carrapatos
StringBuilder por David S 2013 Hora: 30,5 carrapatos
Regex com não compilação por Brandon Time: 63,25 Ticks
StringBuilder pelo usuário214147 Tempo: 77,125 carrapatos
Regex com Tim Hoolihan não compilado Tempo: 147,25 Carrapatos
O código de referência ...
}
Notas de benchmark: modo de lançamento, sem depurador conectado, processador i7, média de 4 execuções, apenas sequências curtas testadas
fonte
Estou compartilhando o que uso, porque parece que descobri algo diferente. Estou usando isso há um tempo e é rápido o suficiente para mim. Não tenho certeza de como ele se compara aos outros. Eu o uso em um gravador de arquivo delimitado e executo grandes tabelas de dados, um campo de cada vez.
fonte
Usando o programa de teste que Jon Skeet postou, tentei ver se conseguia fazer um loop escrito à mão rodar mais rápido.
Posso vencer o NormalizeWithSplitAndJoin todas as vezes, mas apenas vencer o NormalizeWithRegex com entradas de 1000, 5.
Eu não olhei para o código de máquina que o jitter produz, no entanto, espero que o problema seja o tempo gasto pela chamada para StringBuilder.Append () e para fazer muito melhor seria necessário o uso de código não seguro.
Então Regex.Replace () é muito rápido e difícil de bater !!
fonte
VB.NET
C #
Aproveite o poder do LINQ = D
fonte
string.Join(" ", myString.Split(' ').Where(s => s != " ").ToArray())
Split
para capturar todos os espaços em branco e remover aWhere
cláusula:myString.Split(null as char[], StringSplitOptions.RemoveEmptyEntries)
fonte
A menor solução:
var regExp = / \ s + / g, newString = oldString.replace (regExp, '');
fonte
Você pode tentar isto:
fonte
Os grupos de substituição fornecem uma abordagem mais simples para resolver a substituição de vários caracteres de espaço em branco pelo mesmo :
Observe que o segundo exemplo permanece único,
\n
enquanto a resposta aceita substituiria o fim da linha por um espaço.Se você precisar substituir qualquer combinação de caracteres de espaço em branco pelo primeiro, apenas remova a referência anterior
\k
do padrão.fonte
Usar a expressão regular, para substituir 2 ou mais espaços em branco por um único espaço, também é uma boa solução.
Estamos usando o padrão regex como “ \ s + ”.
\ s corresponde a um espaço, guia, nova linha, retorno de carro, avanço de formulário ou guia vertical.
'+' diz uma ou mais ocorrências.
Exemplo Regex
fonte
Não há nenhuma maneira embutida de fazer isso. Você pode tentar isto:
Isso removerá espaços em branco à esquerda e à direita, bem como reduzirá qualquer espaço em branco interno a um único caractere de espaço em branco. Se você realmente deseja apenas reduzir os espaços, as soluções que usam uma expressão regular são melhores; caso contrário, esta solução é melhor. (Veja a análise feita por Jon Skeet.)
fonte
source.ToCharArray()
e jogando fora o resultado?ToCharArray()
o resultado do string.Join, apenas para criar um novo string ... uau, para isso estar em um post reclamando de overhead é simplesmente notável. -1.whitespace
sejanew char[] { ' ' }
, isso dará o resultado errado se a string de entrada começar ou terminar com um espaço.