Как я могу заменить несколько пробелов в строке только одним пробелом в C #?
Пример:
1 2 3 4 5
было бы:
1 2 3 4 5
Как я могу заменить несколько пробелов в строке только одним пробелом в C #?
Пример:
1 2 3 4 5
было бы:
1 2 3 4 5
Ответы:
string sentence = "This is a sentence with multiple spaces";
RegexOptions options = RegexOptions.None;
Regex regex = new Regex("[ ]{2,}", options);
sentence = regex.Replace(sentence, " ");
Мне нравится использовать:
myString = Regex.Replace(myString, @"\s+", " ");
Поскольку он будет перехватывать любые пробелы (например, табуляции, новые строки и т. Д.) И заменять их одним пробелом.
string xyz = "1 2 3 4 5";
xyz = string.Join( " ", xyz.Split( new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries ));
Я думаю, что ответ Мэтта самый лучший, но я не верю, что он совершенно прав. Если вы хотите заменить символы новой строки, вы должны использовать:
myString = Regex.Replace(myString, @"\s+", " ", RegexOptions.Multiline);
Это намного проще, чем все это:
while(str.Contains(" ")) str = str.Replace(" ", " ");
Replace()
Метод будет обрабатывать все вхождения двух пространств в данной строке, поэтому мы не зацикливание (и повторное выделение целой строки) для каждого экземпляра спаренных пробелов в строке. Одно новое распределение будет обрабатывать все из них. Мы перезапускаем цикл только тогда, когда было 3 или более пробелов вместе, что, вероятно, является более редким явлением для многих входных источников. Если вы можете показать, что это становится проблемой для ваших данных, тогда напишите конечный автомат, чтобы вставить символ за символом в новый построитель строк.
Regex может быть довольно медленным даже с простыми задачами. Это создает метод расширения, который можно использовать для любого 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();
}
}
Это будет использоваться как таковой:
string testValue = "This contains too much whitespace."
testValue = testValue.ReduceWhitespace();
// testValue = "This contains too much whitespace."
myString = Regex.Replace(myString, " {2,}", " ");
Для тех, кто не любит Regex
, вот метод, который использует 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();
}
В моих тестах этот метод был в среднем в 16 раз быстрее с очень большим набором строк малого и среднего размера по сравнению со статически скомпилированным Regex. По сравнению с не скомпилированным или нестатичным Regex, это должно быть еще быстрее.
Имейте в виду, что он не удаляет начальные или конечные пробелы, только многократные появления таких.
Вы можете просто сделать это в одном решении линии!
string s = "welcome to london";
s.Replace(" ", "()").Replace(")(", "").Replace("()", " ");
Вы можете выбрать другие скобки (или даже другие символы), если хотите.
"wel()come to london)("
становится "wel come to london"
. Вы можете попробовать использовать много скобок. Поэтому используйте ((((()))))
вместо ()
и )))))(((((
вместо )(
. Это все равно будет работать. Тем не менее, если строка содержит ((((()))))
или )))))(((((
, это не удастся.
Это более короткая версия, которую следует использовать только в том случае, если вы делаете это только один раз, поскольку она создает новый экземпляр Regex
класса при каждом вызове.
temp = new Regex(" {2,}").Replace(temp, " ");
Если вы не слишком знакомы с регулярными выражениями, вот краткое объяснение:
Команда {2,}
regex ищет предшествующий ему символ и находит подстроки от 2 до неограниченного времени. Заменяет все матчи в строке температуры с пробелом..Replace(temp, " ")
Если вы хотите использовать это несколько раз, вот лучший вариант, так как он создает регулярное выражение IL во время компиляции:
Regex singleSpacify = new Regex(" {2,}", RegexOptions.Compiled);
temp = singleSpacify.Replace(temp, " ");
нет Regex, нет Linq ... удаляет начальные и конечные пробелы, а также сокращает любые вложенные сегменты нескольких пробелов в один пробел
string myString = " 0 1 2 3 4 5 ";
myString = string.Join(" ", myString.Split(new char[] { ' ' },
StringSplitOptions.RemoveEmptyEntries));
результат: "0 1 2 3 4 5"
Утешает другие ответы, согласно Джоэлу, и, надеюсь, немного улучшается:
Вы можете сделать это с Regex.Replace()
:
string s = Regex.Replace (
" 1 2 4 5",
@"[ ]{2,}",
" "
);
Или с 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 (" ");
Я просто написал новый, Join
который мне нравится, поэтому я решил, что я отвечу, с этим:
public static string Join<T>(this IEnumerable<T> source, string separator)
{
return string.Join(separator, source.Select(e => e.ToString()).ToArray());
}
Одна из замечательных особенностей этого - то, что он работает с коллекциями, которые не являются строками, вызывая ToString () для элементов. Использование остается прежним:
//...
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";
Я знаю, что это довольно старый, но наткнулся на это, пытаясь достичь почти того же. Нашел это решение в RegEx Buddy. Этот шаблон заменит все двойные пробелы одиночными пробелами, а также урежет начальные и конечные пробелы.
pattern: (?m:^ +| +$|( ){2,})
replacement: $1
Его немного сложно прочитать, поскольку мы имеем дело с пустым пространством, поэтому здесь снова с "пробелами", замененными на "_".
pattern: (?m:^_+|_+$|(_){2,}) <-- don't use this, just for illustration.
Конструкция "(? M:" включает опцию "multi-line". Я обычно хотел бы включить все возможные варианты в сам шаблон, чтобы он был более автономным.
Многие ответы дают правильный результат, но для тех, кто ищет лучшие результаты, я улучшил ответ Ноланара (который был лучшим ответом для производительности) примерно на 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();
}
}
Я могу удалить пробелы с этим
while word.contains(" ") //double space
word = word.Replace(" "," "); //replace double space by single space.
word = word.trim(); //to remove single whitespces from start & end.
попробуйте этот метод
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();
}
используйте это так:
string test = removeNestedWhitespaces("1 2 3 4 5".toCharArray());
Вот небольшая модификация на Nolonar оригинальный ответ .
Проверка, является ли символ не просто пробелом, а пробелом, используйте это:
Он заменит любой символ пробела одним пробелом.
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();
}
Старая школа:
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 " ) );
Без использования регулярных выражений:
while (myString.IndexOf(" ", StringComparison.CurrentCulture) != -1)
{
myString = myString.Replace(" ", " ");
}
Можно использовать на коротких строках, но плохо работает на длинных строках с большим количеством пробелов.
Смесь StringBuilder и Enumerable.Aggregate () в качестве метода расширения для строк:
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 ") + "\"");
}
}
Входные данные:
"1 Hello World 2 "
Вывод:
"1 Hello World 2 "