web-dev-qa-db-ja.com

C#で複数のスペースを単一のスペースに置き換える方法を教えてください。

C#では、文字列内の複数のスペースを1つのスペースに置き換える方法はありますか。

例:

1 2 3  4    5

だろう:

1 2 3 4 5
400
Pokus
RegexOptions options = RegexOptions.None;
Regex regex = new Regex("[ ]{2,}", options);     
tempo = regex.Replace(tempo, " ");
414

私は使うのが好きです。

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

なぜなら、それはあらゆる種類の空白(例えばタブ、改行など)の実行を捉え、それらを単一の空白に置き換えるからです。

562
Matt
string xyz = "1   2   3   4   5";
xyz = string.Join( " ", xyz.Split( new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries ));
42
tvanfosson

私はマットの答えが最善だと思うが、それが全く正しいとは思わない。改行を置き換えたい場合は、次のものを使用する必要があります。

myString = Regex.Replace(myString, @"\s+", " ", RegexOptions.Multiline);
37
Brenda Bell

LINQを使うもう一つのアプローチ:

 var list = str.Split(' ').Where(s => !string.IsNullOrWhiteSpace(s));
 str = string.Join(" ", list);
23
cuongle

それよりもずっと簡単です。

while(str.Contains("  ")) str = str.Replace("  ", " ");
21
Joel Coehoorn

単純なタスクでも正規表現はかなり遅くなる可能性があります。これはどんな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."
19
ScubaSteve
myString = Regex.Replace(myString, " {2,}", " ");
15
Jan Goyvaerts

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();
    }

私のテストでは、この方法は静的にコンパイルされたRegexと比較して、非常に大きな中小サイズの文字列のセットで平均16倍高速でした。コンパイルされていないまたは静的でない正規表現と比べて、これはもっと速いはずです。

notは先頭または末尾のスペースを削除するのではなく、複数回出現することに注意してください。

10
Nolonar

あなたは単に一行の解決策でこれを行うことができます!

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

お望みなら、他の括弧(あるいは他の文字)を選ぶことができます。

8
ravish.hacker

これはより短いバージョンです。これは、呼び出されるたびにRegexクラスの新しいインスタンスを作成するため、これを1回だけ実行する場合にのみ使用してください。

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

あなたがあまりにも正規表現に精通していない場合は、ここで簡単な説明があります:

{2,}は、正規表現に先行する文字を検索させ、2回から無制限の間の部分文字列を見つけます。
.Replace(temp, " ")は、文字列temp内のすべての一致をスペースで置き換えます。

これを複数回使用したい場合は、コンパイル時に正規表現ILを作成するので、これがより良いオプションです。

Regex singleSpacify = new Regex(" {2,}", RegexOptions.Compiled);
temp = singleSpacify.Replace(temp, " ");
6
somebody

正規表現なし、Linqなし...先頭と末尾のスペースを削除し、埋め込まれた複数のスペースセグメントを1つのスペースに削減

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

結果: "0 1 2 3 4 5"

5
Stephen du Buis

Joelごとに他の答えをまとめると、うまくいけば、少し改善することができます。

これは 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 (" ");
4
Jay Bazuzi

私はちょうど私が好きな新しいJoinを書いたので、私はそれを使って再回答することを考えました:

public static string Join<T>(this IEnumerable<T> source, string separator)
{
    return string.Join(separator, source.Select(e => e.ToString()).ToArray());
}

これに関する素晴らしいことの1つは、要素に対してToString()を呼び出すことによって、文字列ではないコレクションを扱うことです。使い方は同じです。

//...

string s = "     1  2    4 5".Split (
    " ".ToCharArray(), 
    StringSplitOptions.RemoveEmptyEntries
    ).Join (" ");
3
Jay Bazuzi

私はこれがかなり古いことを知っています、しかしほとんど同じことを達成しようとしている間、これに遭遇しました。 RegEx Buddyでこの解決策を見つけました。このパターンは、すべてのダブルスペースをシングルスペースに置き換え、また前後のスペースを削除します。

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

空のスペースを扱っているので読むのが少し難しいので、ここでも "スペース"を "_"に置き換えます。

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

"(?m:"構文は "複数行"オプションを有効にします。私は一般的に私がパターン自身の中にできるオプションをすべて含めることを好みます。

2
Paul Easter

この方法を試してください

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());
1
Ahmed Aljaff

これで空白を削除できます

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
Learner1947

多くの答えが正しい出力を提供していますが、最高のパフォーマンスを探している人のために、私は約改善しました Nolanarの答え (これはパフォーマンスの最高の答えでした) 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
The_Black_Smurf

古いスカル:

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 " ) );
0
onedaywhen

正規表現パターンを使う

    [ ]+    #only space

   var text = Regex.Replace(inputString, @"[ ]+", " ");
0
M.Hassan

正規表現を使わないで

while (myString.IndexOf("  ", StringComparison.CurrentCulture) != -1)
{
    myString = myString.Replace("  ", " ");
}

短い文字列では使用できますが、スペースの多い長い文字列ではパフォーマンスが低下します。

0
Tom Gullen

文字列の拡張メソッドとしての StringBuilderEnumerable.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 "
0
Patrick Artner
      // 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
JIYAUL MUSTAPHA