Como posso substituir vários espaços em uma seqüência de caracteres por apenas um espaço em C #?
Exemplo:
1 2 3 4 5
seria:
1 2 3 4 5
Como posso substituir vários espaços em uma seqüência de caracteres por apenas um espaço em C #?
Exemplo:
1 2 3 4 5
seria:
1 2 3 4 5
Respostas:
string sentence = "This is a sentence with multiple spaces";
RegexOptions options = RegexOptions.None;
Regex regex = new Regex("[ ]{2,}", options);
sentence = regex.Replace(sentence, " ");
Eu gosto de usar:
myString = Regex.Replace(myString, @"\s+", " ");
Uma vez que ele captura execuções de qualquer tipo de espaço em branco (por exemplo, guias, novas linhas etc.) e as substitui por um único espaço.
string xyz = "1 2 3 4 5";
xyz = string.Join( " ", xyz.Split( new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries ));
Acho que a resposta de Matt é a melhor, mas não acredito que esteja certa. Se você deseja substituir novas linhas, você deve usar:
myString = Regex.Replace(myString, @"\s+", " ", RegexOptions.Multiline);
É muito mais simples do que tudo isso:
while(str.Contains(" ")) str = str.Replace(" ", " ");
Replace()
método manipula todas as ocorrências de dois espaços em uma determinada sequência, portanto, não estamos fazendo loop (e alocando uma sequência inteira) para todas as instâncias de espaços emparelhados na sequência. Uma nova alocação tratará de todos eles. Só executamos novamente o loop quando havia 3 ou mais espaços juntos, o que provavelmente será uma ocorrência mais rara para muitas fontes de entrada. Se você puder mostrar que isso se torna um problema para seus dados, escreva a máquina de estado para inserir caracteres por caractere em um novo construtor de strings.
Regex pode ser bastante lento, mesmo com tarefas simples. Isso cria um método de extensão que pode ser usado em qualquer um string
.
public static class StringExtension
{
public static String ReduceWhitespace(this String value)
{
var newString = new StringBuilder();
bool previousIsWhitespace = false;
for (int i = 0; i < value.Length; i++)
{
if (Char.IsWhiteSpace(value[i]))
{
if (previousIsWhitespace)
{
continue;
}
previousIsWhitespace = true;
}
else
{
previousIsWhitespace = false;
}
newString.Append(value[i]);
}
return newString.ToString();
}
}
Seria usado como tal:
string testValue = "This contains too much whitespace."
testValue = testValue.ReduceWhitespace();
// testValue = "This contains too much whitespace."
myString = Regex.Replace(myString, " {2,}", " ");
Para quem não gosta Regex
, aqui está um método que usa StringBuilder
:
public static string FilterWhiteSpaces(string input)
{
if (input == null)
return string.Empty;
StringBuilder stringBuilder = new StringBuilder(input.Length);
for (int i = 0; i < input.Length; i++)
{
char c = input[i];
if (i == 0 || c != ' ' || (c == ' ' && input[i - 1] != ' '))
stringBuilder.Append(c);
}
return stringBuilder.ToString();
}
Nos meus testes, esse método era 16 vezes mais rápido, em média, com um conjunto muito grande de cadeias de tamanho pequeno a médio, em comparação com um Regex compilado estático. Comparado a um Regex não compilado ou não estático, isso deve ser ainda mais rápido.
Lembre-se de que ele não remove espaços à esquerda ou à direita, apenas várias ocorrências desse tipo.
Você pode simplesmente fazer isso em uma solução de linha!
string s = "welcome to london";
s.Replace(" ", "()").Replace(")(", "").Replace("()", " ");
Você pode escolher outros colchetes (ou até outros caracteres), se quiser.
"wel()come to london)("
se torna "wel come to london"
. Você pode tentar usar muitos colchetes. Portanto, use em ((((()))))
vez de ()
e em )))))(((((
vez de )(
. Ainda funcionará. Ainda assim, se a string contém ((((()))))
ou )))))(((((
, isso falhará #
Esta é uma versão mais curta, que só deve ser usada se você estiver fazendo isso uma vez, pois ela cria uma nova instância da Regex
classe toda vez que é chamada.
temp = new Regex(" {2,}").Replace(temp, " ");
Se você não conhece muito expressões regulares, aqui está uma breve explicação:
O {2,}
torna a pesquisa regex para o personagem que o precede, e encontra substrings entre 2 e ilimitadas vezes.
o.Replace(temp, " ")
substitui todas as correspondências na string temp por um espaço.
Se você deseja usar isso várias vezes, aqui está uma opção melhor, pois ela cria a IL do regex em tempo de compilação:
Regex singleSpacify = new Regex(" {2,}", RegexOptions.Compiled);
temp = singleSpacify.Replace(temp, " ");
no Regex, no Linq ... remove os espaços iniciais e finais, além de reduzir qualquer segmento de espaço múltiplo incorporado em um espaço
string myString = " 0 1 2 3 4 5 ";
myString = string.Join(" ", myString.Split(new char[] { ' ' },
StringSplitOptions.RemoveEmptyEntries));
resultado: "0 1 2 3 4 5"
Consolando outras respostas, por Joel, e, esperançosamente, melhorando um pouco à medida que vou:
Você pode fazer isso com Regex.Replace()
:
string s = Regex.Replace (
" 1 2 4 5",
@"[ ]{2,}",
" "
);
Ou com String.Split()
:
static class StringExtensions
{
public static string Join(this IList<string> value, string separator)
{
return string.Join(separator, value.ToArray());
}
}
//...
string s = " 1 2 4 5".Split (
" ".ToCharArray(),
StringSplitOptions.RemoveEmptyEntries
).Join (" ");
Acabei de escrever um novo Join
que eu gosto, então pensei em responder novamente:
public static string Join<T>(this IEnumerable<T> source, string separator)
{
return string.Join(separator, source.Select(e => e.ToString()).ToArray());
}
Uma das coisas legais sobre isso é que ele trabalha com coleções que não são strings, chamando ToString () nos elementos. O uso ainda é o mesmo:
//...
string s = " 1 2 4 5".Split (
" ".ToCharArray(),
StringSplitOptions.RemoveEmptyEntries
).Join (" ");
// Mysample string
string str ="hi you are a demo";
//Split the words based on white sapce
var demo= str .Split(' ').Where(s => !string.IsNullOrWhiteSpace(s));
//Join the values back and add a single space in between
str = string.Join(" ", demo);
//output: string str ="hi you are a demo";
Eu sei que isso é bem antigo, mas me deparei com isso enquanto tentava realizar quase a mesma coisa. Encontrei esta solução no RegEx Buddy. Esse padrão substitui todos os espaços duplos por espaços simples e também apara os espaços iniciais e finais.
pattern: (?m:^ +| +$|( ){2,})
replacement: $1
É um pouco difícil de ler, já que estamos lidando com espaço vazio, então aqui está novamente com os "espaços" substituídos por um "_".
pattern: (?m:^_+|_+$|(_){2,}) <-- don't use this, just for illustration.
A construção "(? M:" ativa a opção "multi-line". Geralmente, gosto de incluir todas as opções possíveis no próprio padrão, para que fique mais independente.
Muitas respostas estão fornecendo a saída certa, mas para aqueles que procuram as melhores performances, eu melhorei a resposta de Nolanar (que foi a melhor resposta para o desempenho) em cerca de 10%.
public static string MergeSpaces(this string str)
{
if (str == null)
{
return null;
}
else
{
StringBuilder stringBuilder = new StringBuilder(str.Length);
int i = 0;
foreach (char c in str)
{
if (c != ' ' || i == 0 || str[i - 1] != ' ')
stringBuilder.Append(c);
i++;
}
return stringBuilder.ToString();
}
}
Posso remover espaços em branco com este
while word.contains(" ") //double space
word = word.Replace(" "," "); //replace double space by single space.
word = word.trim(); //to remove single whitespces from start & end.
tente este método
private string removeNestedWhitespaces(char[] st)
{
StringBuilder sb = new StringBuilder();
int indx = 0, length = st.Length;
while (indx < length)
{
sb.Append(st[indx]);
indx++;
while (indx < length && st[indx] == ' ')
indx++;
if(sb.Length > 1 && sb[0] != ' ')
sb.Append(' ');
}
return sb.ToString();
}
use-o assim:
string test = removeNestedWhitespaces("1 2 3 4 5".toCharArray());
Aqui está uma pequena modificação na resposta original do Nolonar .
Verificando se o caractere não é apenas um espaço, mas qualquer espaço em branco, use o seguinte:
Ele substituirá qualquer caractere de espaço em branco múltiplo por um único espaço.
public static string FilterWhiteSpaces(string input)
{
if (input == null)
return string.Empty;
var stringBuilder = new StringBuilder(input.Length);
for (int i = 0; i < input.Length; i++)
{
char c = input[i];
if (i == 0 || !char.IsWhiteSpace(c) || (char.IsWhiteSpace(c) &&
!char.IsWhiteSpace(strValue[i - 1])))
stringBuilder.Append(c);
}
return stringBuilder.ToString();
}
Skool antigo:
string oldText = " 1 2 3 4 5 ";
string newText = oldText
.Replace(" ", " " + (char)22 )
.Replace( (char)22 + " ", "" )
.Replace( (char)22 + "", "" );
Assert.That( newText, Is.EqualTo( " 1 2 3 4 5 " ) );
Sem usar expressões regulares:
while (myString.IndexOf(" ", StringComparison.CurrentCulture) != -1)
{
myString = myString.Replace(" ", " ");
}
OK para usar em cadeias curtas, mas terá um desempenho ruim em cadeias longas com muitos espaços.
Mistura de StringBuilder e Enumerable.Aggregate () como método de extensão para seqüências de caracteres:
using System;
using System.Linq;
using System.Text;
public static class StringExtension
{
public static string StripSpaces(this string s)
{
return s.Aggregate(new StringBuilder(), (acc, c) =>
{
if (c != ' ' || acc.Length > 0 && acc[acc.Length-1] != ' ')
acc.Append(c);
return acc;
}).ToString();
}
public static void Main()
{
Console.WriteLine("\"" + StringExtension.StripSpaces("1 Hello World 2 ") + "\"");
}
}
Entrada:
"1 Hello World 2 "
Resultado:
"1 Hello World 2 "