C#では、文字列内の複数のスペースを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, " ");
私は使うのが好きです:
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);
LINQを使うもう一つのアプローチ:
var list = str.Split(' ').Where(s => !string.IsNullOrWhiteSpace(s));
str = string.Join(" ", list);
それよりもずっと簡単です。
while(str.Contains(" ")) str = str.Replace(" ", " ");
myString = Regex.Replace(myString, " {2,}", " ");
単純なタスクでも正規表現はかなり遅くなる可能性があります。これはどのメソッドからでも使用できる拡張メソッドを作成します。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倍高速でした。コンパイルされていない、あるいは静的でない正規表現と比べて、これはもっと速いはずです。
覚えておいて、それがすることではない先頭または末尾のスペースは削除してください。
あなたは単に一行の解決策でこれを行うことができます!
string s = "welcome to london";
s.Replace(" ", "()").Replace(")(", "").Replace("()", " ");
お望みなら、他の括弧(あるいは他の文字)を選ぶことができます。
"wel()come to london)("
になる"wel come to london"
。あなたはたくさんの括弧を使ってみることができます。だから使う((((()))))
の代わりに()
そして)))))(((((
の代わりに)(
。それはまだ動作します。それでも、文字列に((((()))))
または)))))(((((
、これは失敗します。 - nmit026
これはより短いバージョンです。これは、これを1回しか実行しない場合にのみ使用する必要があります。Regex
呼び出されるたびにクラス。
temp = new Regex(" {2,}").Replace(temp, " ");
あなたがあまりにも正規表現に精通していない場合は、ここで簡単な説明があります:
の{2,}
正規表現にその前の文字を検索させ、2から無制限の間の部分文字列を見つけます。
の.Replace(temp, " ")
文字列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 (" ");
私はこれがかなり古いことを知っています、しかしほとんど同じことを達成しようとしている間、これに遭遇しました。 RegEx Buddyでこの解決策を見つけました。このパターンは、すべてのダブルスペースをシングルスペースに置き換え、また前後のスペースを削除します。
pattern: (?m:^ +| +$|( ){2,})
replacement: $1
私たちが空のスペースを扱っているので、それは読むのが少し難しいので、ここでまたここでは "スペース"が "_"に置き換えられています。
pattern: (?m:^_+|_+$|(_){2,}) <-- don't use this, just for illustration.
"(?m:"構文は "複数行"オプションを有効にします。私は一般的にパターン自体の中にできるオプションをすべて含めることを好みます。
これで空白を削除できます
while word.contains(" ") //double space
word = word.Replace(" "," "); //replace double space by single space.
word = word.trim(); //to remove single whitespces from start & end.
多くの答えが正しい出力を提供していますが、最高のパフォーマンスを探している人のために、私は改善しました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();
}
}
この方法を試してください
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());
オールドスクール:
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 " ) );
(char)22
- onedaywhen
正規表現を使わないで
while (myString.IndexOf(" ", StringComparison.CurrentCulture) != -1)
{
myString = myString.Replace(" ", " ");
}
短い文字列では使用できますが、スペースの多い長い文字列ではパフォーマンスが低下します。
正規表現パターンを使う
[ ]+ #only space
var text = Regex.Replace(inputString, @"[ ]+", " ");
のミックス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 "