Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
  • Страница:
  • 1
  • 2

ТЕМА:

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

  • Олег Коровяков
  • Олег Коровяков аватар Автор темы
  • Не в сети
  • Автор сайта
  • Автор сайта
  • Сообщений: 280
  • Репутация: 1
  • Спасибо получено: 1
Пример:
1 2  3   4       5
:

1 2 3 4 5

Решение:
RegexOptions options = RegexOptions.None;
Regex regex = new Regex("[ ]{2,}", options);     
tempo = regex.Replace(tempo, " ");

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

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

  • Олег Коровяков
  • Олег Коровяков аватар Автор темы
  • Не в сети
  • Автор сайта
  • Автор сайта
  • Сообщений: 280
  • Репутация: 1
  • Спасибо получено: 1
Мне нравится использовать:
myString = Regex.Replace(myString, @"\s+", " ");
Так как он будет улавливать прогоны любого вида пробелов (например, вкладки, новые строки и т.д.) и заменять их одним пробелом.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

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

  • Олег Коровяков
  • Олег Коровяков аватар Автор темы
  • Не в сети
  • Автор сайта
  • Автор сайта
  • Сообщений: 280
  • Репутация: 1
  • Спасибо получено: 1
Другой подход, который использует LINQ:
var list = str.Split(' ').Where(s => !string.IsNullOrWhiteSpace(s));
 str = string.Join(" ", list);

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

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

  • Олег Коровяков
  • Олег Коровяков аватар Автор темы
  • Не в сети
  • Автор сайта
  • Автор сайта
  • Сообщений: 280
  • Репутация: 1
  • Спасибо получено: 1
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."

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

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

  • Олег Коровяков
  • Олег Коровяков аватар Автор темы
  • Не в сети
  • Автор сайта
  • Автор сайта
  • Сообщений: 280
  • Репутация: 1
  • Спасибо получено: 1
Для тех, кому не нравится 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, это должно быть еще быстрее.

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

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

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

  • Олег Коровяков
  • Олег Коровяков аватар Автор темы
  • Не в сети
  • Автор сайта
  • Автор сайта
  • Сообщений: 280
  • Репутация: 1
  • Спасибо получено: 1
попробуйте этот метод
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++;
    }
    return sb.ToString();
}
используйте его следующим образом:
string test = removeNestedWhitespaces("1 2 3  4    5".toCharArray());

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

  • Страница:
  • 1
  • 2
Модераторы: Дмитрий

О сайте

Строительство индивидуальных домов из лёгкого самана - опыт, советы, методика строительства и подробные инструкции. А также возможность применения альтернативных источников энергии.


Контакты

08340. ул.Салютная 17. с.Гнедын.
Киевская обл. Украина.

+38 067 492 4124.
+38 095 065 8860.

info@okwood.com.ua
www.okwood.com.ua

Местоположения


8PM2+7R Гнедин, Kyiv Oblast