Wie kann ich mehrere Leerzeichen in einer Zeichenfolge durch nur ein Leerzeichen in C # ersetzen?
Beispiel:
1 2 3 4 5
wäre:
1 2 3 4 5
RegexOptions options = RegexOptions.None;
Regex regex = new Regex("[ ]{2,}", options);
tempo = regex.Replace(tempo, " ");
Ich benutze gerne:
myString = Regex.Replace(myString, @"\s+", " ");
Da es Läufe jeglicher Art von Leerzeichen (z. B. Registerkarten, Zeilenumbrüche usw.) fängt und durch ein einzelnes Leerzeichen ersetzt.
string xyz = "1 2 3 4 5";
xyz = string.Join( " ", xyz.Split( new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries ));
Ich denke, dass Matt die beste Antwort ist, aber ich glaube nicht, dass es richtig ist. Wenn Sie Zeilenumbrüche ersetzen möchten, müssen Sie Folgendes verwenden:
myString = Regex.Replace(myString, @"\s+", " ", RegexOptions.Multiline);
Ein anderer Ansatz, der LINQ verwendet:
var list = str.Split(' ').Where(s => !string.IsNullOrWhiteSpace(s));
str = string.Join(" ", list);
Es ist viel einfacher als das alles:
while(str.Contains(" ")) str = str.Replace(" ", " ");
Regex kann auch bei einfachen Aufgaben ziemlich langsam sein. Dadurch wird eine Erweiterungsmethode erstellt, die von jeder string
verwendet werden kann.
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();
}
}
Es würde als solches verwendet werden:
string testValue = "This contains too much whitespace."
testValue = testValue.ReduceWhitespace();
// testValue = "This contains too much whitespace."
myString = Regex.Replace(myString, " {2,}", " ");
Für diejenigen, die Regex
nicht mögen, ist hier eine Methode, die StringBuilder
verwendet:
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();
}
In meinen Tests war diese Methode im Vergleich zu einer statisch kompilierten Regex im Durchschnitt 16-mal schneller mit einem sehr großen Satz von kleinen bis mittelgroßen Saiten. Verglichen mit einem nicht kompilierten oder nicht statischen Regex sollte dies noch schneller sein.
Denken Sie daran, dass nicht führende oder nachfolgende Leerzeichen entfernt, nur mehrere Vorkommen von solchen.
Sie können dies einfach in einer Lösung tun!
string s = "welcome to london";
s.Replace(" ", "()").Replace(")(", "").Replace("()", " ");
Sie können andere Klammern (oder sogar andere Zeichen) auswählen, wenn Sie möchten.
no Regex, no Linq ... entfernt führende und nachgestellte Leerzeichen und reduziert alle eingebetteten Segmente auf ein Leerzeichen
string myString = " 0 1 2 3 4 5 ";
myString = string.Join(" ", myString.Split(new char[] { ' ' },
StringSplitOptions.RemoveEmptyEntries));
ergebnis: "0 1 2 3 4 5"
Dies ist eine kürzere Version, die nur verwendet werden sollte, wenn Sie dies nur einmal ausführen, da bei jedem Aufruf eine neue Instanz der Regex
-Klasse erstellt wird.
temp = new Regex(" {2,}").Replace(temp, " ");
Wenn Sie nicht mit regulären Ausdrücken vertraut sind, finden Sie hier eine kurze Erklärung:
Mit dem {2,}
sucht der Regex nach dem vorangehenden Zeichen und findet Teilzeichenfolgen zwischen 2 und unbegrenzten Zeiten.
.__ Die .Replace(temp, " ")
ersetzt alle Übereinstimmungen im String-Temp durch ein Leerzeichen.
Wenn Sie dies mehrmals verwenden möchten, ist hier die bessere Option, da die Regex-IL zur Kompilierzeit erstellt wird:
Regex singleSpacify = new Regex(" {2,}", RegexOptions.Compiled);
temp = singleSpacify.Replace(temp, " ");
Andere Antworten konsolidieren, pro Joel, und hoffentlich ein wenig besser, wenn ich gehe:
Sie können dies mit Regex.Replace()
tun:
string s = Regex.Replace (
" 1 2 4 5",
@"[ ]{2,}",
" "
);
Oder mit 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 (" ");
Ich habe gerade eine neue Join
geschrieben, die mir gefällt, also dachte ich, ich würde noch einmal antworten:
public static string Join<T>(this IEnumerable<T> source, string separator)
{
return string.Join(separator, source.Select(e => e.ToString()).ToArray());
}
Das Coole daran ist, dass es mit Sammlungen arbeitet, die keine Strings sind, indem ToString () für die Elemente aufgerufen wird. Die Nutzung ist immer noch gleich:
//...
string s = " 1 2 4 5".Split (
" ".ToCharArray(),
StringSplitOptions.RemoveEmptyEntries
).Join (" ");
Ich weiß, dass das ziemlich alt ist, aber ich bin auf das gestoßen, als ich versuchte, fast dasselbe zu erreichen. Diese Lösung wurde in RegEx Buddy gefunden. Dieses Muster ersetzt alle doppelten Leerzeichen durch einzelne Leerzeichen und schneidet auch führende und nachfolgende Leerzeichen ab.
pattern: (?m:^ +| +$|( ){2,})
replacement: $1
Es ist ein wenig schwer zu lesen, da es sich um leere Räume handelt, daher werden hier wieder "Leerzeichen" durch ein "_" ersetzt.
pattern: (?m:^_+|_+$|(_){2,}) <-- don't use this, just for illustration.
Das Konstrukt "(? M:") aktiviert die Option "mehrzeilig". Im Allgemeinen möchte ich alle möglichen Optionen in das Muster einschließen, sodass es mehr in sich geschlossen ist.
probiere diese Methode
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();
}
benutze es so:
string test = removeNestedWhitespaces("1 2 3 4 5".toCharArray());
Ich kann damit Leerzeichen entfernen
while Word.contains(" ") //double space
Word = Word.Replace(" "," "); //replace double space by single space.
Word = Word.trim(); //to remove single whitespces from start & end.
Viele Antworten liefern den richtigen Output, aber für diejenigen, die die besten Leistungen erwarten, habe ich Nolanars Antwort (was die beste Antwort für die Leistung war) um etwa 10% verbessert.
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();
}
}
Alte Schule:
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 " ) );
Verwenden Sie das Regex-Muster
[ ]+ #only space
var text = Regex.Replace(inputString, @"[ ]+", " ");
Ohne reguläre Ausdrücke zu verwenden:
while (myString.IndexOf(" ", StringComparison.CurrentCulture) != -1)
{
myString = myString.Replace(" ", " ");
}
OK für kurze Saiten, aber bei langen Saiten mit vielen Leerzeichen schlecht.
Mix aus StringBuilder und Enumerable.Aggregate () als Erweiterungsmethode für Strings:
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 ") + "\"");
}
}
Eingang:
"1 Hello World 2 "
Ausgabe:
"1 Hello World 2 "
// 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";