文字列内の複数のスペースをC#の1つのスペースのみに置き換えるにはどうすればよいですか?
例:
1 2 3 4 5
だろう:
1 2 3 4 5
文字列内の複数のスペースをC#の1つのスペースのみに置き換えるにはどうすればよいですか?
例:
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()
メソッドは、指定された文字列内の2つのスペースのすべての出現を処理するため、文字列内のペアになっているスペースのインスタンスごとにループ(および文字列全体を再割り当て)しません。1つの新しい割り当てでそれらすべてを処理します。3つ以上のスペースが一緒にある場合にのみループを再実行します。これは、多くの入力ソースでまれに発生する可能性があります。データに問題があることを示すことができる場合は、ステートマシンを作成して、新しい文字列ビルダーに1文字ずつプッシュします。
単純なタスクでも、正規表現はかなり遅くなる可能性があります。これにより、任意のから使用できる拡張メソッドが作成されます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."
が気に入らない人のために、以下を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倍高速でした。コンパイルされていない、または静的でない正規表現と比較すると、これはさらに高速です。
先頭または末尾のスペースは削除されず、そのような複数のオカレンスのみが削除されることに注意してください。
これは、1行のソリューションで簡単に実行できます。
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,}
その前の文字の正規表現検索を行い、2と無制限の時間の間の部分文字列を検索します。スペースで文字列の一時にすべての一致を置き換えます。.Replace(temp, " ")
これを複数回使用する場合は、コンパイル時に正規表現ILを作成するため、より良いオプションがここにあります。
Regex singleSpacify = new Regex(" {2,}", RegexOptions.Compiled);
temp = singleSpacify.Replace(temp, " ");
正規表現なし、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"
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 (" ");
私は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 (" ");
// 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:"構成は、 "複数行"オプションを有効にします。一般的に、パターン自体に含めることができるすべてのオプションを含めて、より自己完結型にします。
多くの答えが正しい出力を提供していますが、最高のパフォーマンスを求めている人のために、私は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();
}
}
これで空白を削除できます
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の元の回答を少し変更したものです。
文字が単なるスペースではなく空白であるかどうかを確認するには、次のようにします。
複数の空白文字を1つのスペースに置き換えます。
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();
}
文字列の拡張メソッドとしての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 "