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

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

Пример:

1 2 3  4    5

будет:

1 2 3 4 5

Ответы [ 23 ]

6 голосов
/ 14 мая 2015

Это более короткая версия, которую следует использовать, только если вы делаете это только один раз, поскольку она создает новый экземпляр класса Regex каждый раз, когда он вызывается.

temp = new Regex(" {2,}").Replace(temp, " "); 

Если вы не слишком знакомы с регулярными выражениями, вот краткое объяснение:

{2,} выполняет регулярное выражение для поиска предшествующего ему символа и находит подстроки от 2 до неограниченного времени.
.Replace(temp, " ") заменяет все совпадения в строке temp пробелом.

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

Regex singleSpacify = new Regex(" {2,}", RegexOptions.Compiled);
temp = singleSpacify.Replace(temp, " ");
5 голосов
/ 18 января 2018

no Regex, no Linq ... удаляет начальные и конечные пробелы, а также сокращает любые вложенные сегменты из нескольких пробелов в один пробел

string myString = "   0 1 2  3   4               5  ";
myString = string.Join(" ", myString.Split(new char[] { ' ' }, 
StringSplitOptions.RemoveEmptyEntries));

результат: "0 1 2 3 4 5"

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

Консолидация других ответов, на Джоэла, и, надеюсь, немного улучшается, как я иду:

Вы можете сделать это с помощью 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 (" ");
3 голосов
/ 20 октября 2008

Я только что написал новый 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 (" ");
2 голосов
/ 20 июля 2014

Я знаю, что это довольно старо, но наткнулся на это, пытаясь достичь почти того же. Нашел это решение в RegEx Buddy. Этот шаблон заменит все двойные пробелы одинарными пробелами, а также урежет начальные и конечные пробелы.

pattern: (?m:^ +| +$|( ){2,})
replacement: $1

Его немного сложно прочитать, поскольку мы имеем дело с пустым пространством, поэтому здесь снова с "пробелами", замененными на "_".

pattern: (?m:^_+|_+$|(_){2,})  <-- don't use this, just for illustration.

Конструкция "(? M:" включает опцию "multi-line". Я обычно хотел бы включить все возможные варианты в сам шаблон, чтобы он был более автономным.

1 голос
/ 27 февраля 2018

Многие ответы дают правильный результат, но для тех, кто ищет лучшие результаты, я улучшил Ответ Ноланара (который был лучшим ответом для производительности) примерно на 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();
    }

}
1 голос
/ 11 февраля 2016

Я могу удалить пробелы с помощью этого

while word.contains("  ")  //double space
   word = word.Replace("  "," "); //replace double space by single space.
word = word.trim(); //to remove single whitespces from start & end.
1 голос
/ 22 января 2016

попробуйте этот метод

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());
0 голосов
/ 17 мая 2019
      // 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";
0 голосов
/ 28 ноября 2018

Микс 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 "
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...