Comment puis-je remplacer plusieurs espaces par un seul espace en C#?
21 réponses
RegexOptions options = RegexOptions.None;
Regex regex = new Regex("[ ]{2,}", options);
tempo = regex.Replace(tempo, " ");
j'aime à utiliser:
myString = Regex.Replace(myString, @"\s+", " ");
Puisqu'il capturera des passages de n'importe quel type d'espace blanc (par exemple tabs, newlines, etc.) et les remplacer par un seul espace.
string xyz = "1 2 3 4 5";
xyz = string.Join( " ", xyz.Split( new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries ));
je pense que la réponse de Matt est la meilleure, mais je ne crois pas que ce soit tout à fait juste. Si vous voulez remplacer newlines, vous devez utiliser:
myString = Regex.Replace(myString, @"\s+", " ", RegexOptions.Multiline);
c'est beaucoup plus simple que tout cela:
while(str.Contains(" ")) str = str.Replace(" ", " ");
une autre approche qui utilise LINQ:
var list = str.Split(' ').Where(s => !string.IsNullOrWhiteSpace(s));
str = string.Join(" ", list);
Regex peut être assez lent même avec des tâches simples. Cela crée une méthode d'extension qui peut être utilisée hors de n'importe quel 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();
}
}
il serait utilisé comme tel:
string testValue = "This contains too much whitespace."
testValue = testValue.ReduceWhitespace();
// testValue = "This contains too much whitespace."
Pour ceux qui n'aiment pas Regex
, voici une méthode qui utilise le 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();
}
dans mes tests, cette méthode était 16 fois plus rapide en moyenne avec un très grand ensemble de chaînes de taille petite à moyenne, comparé à un Regex compilé statique. Comparé à un Regex non compilé ou non statique, cela devrait être encore plus rapide.
Gardez à l'esprit, qu'il ne pas supprimer ou les espaces, seulement plusieurs occurrences de tels.
vous pouvez simplement faire cela dans une solution de ligne!
string s = "welcome to london";
s.Replace(" ", "()").Replace(")(", "").Replace("()", " ");
Vous pouvez choisir d'autres supports (ou même d'autres caractères) si vous le souhaitez.
c'est une version plus courte, qui ne doit être utilisée que si vous ne le faites qu'une fois, car elle crée une nouvelle instance de la classe Regex
à chaque fois qu'elle est appelée.
temp = new Regex(" {2,}").Replace(temp, " ");
si vous n'êtes pas trop familier avec les expressions régulières, voici une brève explication:
le {2,}
effectue la recherche regex pour le caractère qui le précède, et trouve des substrats entre 2 et des temps illimités.
Le .Replace(temp, " ")
remplace toutes les allumettes de la chaîne temp par un espace.
si vous voulez l'utiliser plusieurs fois, voici une meilleure option, car elle crée le fichier au moment de la compilation:
Regex singleSpacify = new Regex(" {2,}", RegexOptions.Compiled);
temp = singleSpacify.Replace(temp, " ");
Consolodating d'autres réponses, par Joel, et nous espérons améliorer légèrement comme je l'aller:
vous pouvez le faire avec Regex.Replace()
:
string s = Regex.Replace (
" 1 2 4 5",
@"[ ]{2,}",
" "
);
ou avec 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 (" ");
pas de Regex, pas de Linq... supprime les espaces de tête et de queue et réduit les segments d'espace multiples encastrés à un seul espace
string myString = " 0 1 2 3 4 5 ";
myString = string.Join(" ", myString.Split(new char[] { ' ' },
StringSplitOptions.RemoveEmptyEntries));
résultat:"0 1 2 3 4 5"
je sais que c'est assez vieux, mais j'ai couru à travers ceci en essayant d'accomplir presque la même chose. J'ai trouvé cette solution dans RegEx Buddy. Ce modèle remplacera tous les espaces doubles par des espaces simples et aussi garnir les espaces de tête et de fuite.
pattern: (?m:^ +| +$|( ){2,})
replacement:
C'est un peu difficile à lire puisqu'il s'agit d'un espace vide, donc ici c'est à nouveau avec les" espaces "remplacés par un"_".
pattern: (?m:^_+|_+$|(_){2,}) <-- don't use this, just for illustration.
La "(?m: "la construction permet la option" multi-ligne". J'aime généralement inclure toutes les options que je peux dans le modèle lui-même afin qu'il soit plus autonome.
je viens d'écrire un nouveau Join
que j'aime, donc j'ai pensé que je vais re-répondre, avec elle:
public static string Join<T>(this IEnumerable<T> source, string separator)
{
return string.Join(separator, source.Select(e => e.ToString()).ToArray());
}
une des choses cool à ce sujet est qu'il fonctionne avec des collections qui ne sont pas des chaînes, en appelant ToString() sur les éléments. L'Usage est toujours le même:
//...
string s = " 1 2 4 5".Split (
" ".ToCharArray(),
StringSplitOptions.RemoveEmptyEntries
).Join (" ");
je peux enlever les espaces blancs avec ce
while word.contains(" ") //double space
word = word.Replace(" "," "); //replace double space by single space.
word = word.trim(); //to remove single whitespces from start & end.
beaucoup de réponses fournissent la bonne sortie, mais pour ceux qui recherchent les meilleures performances, j'ai amélioré réponse de Nolanar (qui était la meilleure réponse pour la performance) d'environ 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();
}
}
essayez cette méthode
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();
}
utilisez - le comme ceci:
string test = removeNestedWhitespaces("1 2 3 4 5".toCharArray());
Old skool:
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 " ) );
sans utiliser d'expressions régulières:
while (myString.IndexOf(" ", StringComparison.CurrentCulture) != -1)
{
myString = myString.Replace(" ", " ");
}
OK à utiliser sur les cordes courtes, mais mal performer sur les cordes longues avec beaucoup d'espaces.
utiliser le motif regex
[ ]+ #only space
var text = Regex.Replace(inputString, @"[ ]+", " ");