Как заменить несколько пробелов одним пробелом в C #? - PullRequest
400 голосов
/ 16 октября 2008

Как мне заменить несколько пробелов в строке только одним пробелом в C #?

Пример:

1 2 3  4    5

будет:

1 2 3 4 5

Ответы [ 23 ]

560 голосов
/ 16 октября 2008

Мне нравится использовать:

myString = Regex.Replace(myString, @"\s+", " ");

Поскольку он будет перехватывать любые пробелы (например, табуляции, новые строки и т. Д.) И заменять их одним пробелом.

414 голосов
/ 16 октября 2008
RegexOptions options = RegexOptions.None;
Regex regex = new Regex("[ ]{2,}", options);     
tempo = regex.Replace(tempo, " ");
41 голосов
/ 16 октября 2008
string xyz = "1   2   3   4   5";
xyz = string.Join( " ", xyz.Split( new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries ));
37 голосов
/ 21 мая 2010

Я думаю, что ответ Мэтта самый лучший, но я не верю, что он совершенно прав. Если вы хотите заменить символы новой строки, вы должны использовать:

myString = Regex.Replace(myString, @"\s+", " ", RegexOptions.Multiline);
23 голосов
/ 14 августа 2012

Другой подход, который использует LINQ:

 var list = str.Split(' ').Where(s => !string.IsNullOrWhiteSpace(s));
 str = string.Join(" ", list);
21 голосов
/ 16 октября 2008

Это намного проще, чем все это:

while(str.Contains("  ")) str = str.Replace("  ", " ");
19 голосов
/ 20 ноября 2015

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."
15 голосов
/ 20 ноября 2008
myString = Regex.Replace(myString, " {2,}", " ");
10 голосов
/ 27 мая 2013

Для тех, кому не нравится 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, это должно быть еще быстрее.

Имейте в виду, что не удаляет начальные или конечные пробелы, только несколько таких случаев.

8 голосов
/ 06 марта 2015

Вы можете просто сделать это одним решением!

string s = "welcome to  london";
s.Replace(" ", "()").Replace(")(", "").Replace("()", " ");

Вы можете выбрать другие скобки (или даже другие символы), если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...