2012-03-03 38 views
4

単語間に空白文字(\t\nまたは空白)の未知の組み合わせが含まれている文字列があります。たとえば:文字列内の空白文字を切り捨てます

string str = "Hello \t\t \n \t \t World! \tPlease Help."; 

は、私は単一のスペースと、内側の空白文字の各シーケンスを交換したい:

string str = "Hello World! Please Help."; 

は、.NETこれを行うための組み込みの方法を提供していますか?もしそうでなければ、どうすればC#でこれを行うことができますか?

答えて

4

は、この単一のスペースで空白文字(\s)の各グループを置き換える、次の正規表現の置換

string original = ...; 
string replaced = Regex.Replace(original, @"\s+", " "); 

を試してみてください。あなたはここに他の有用な文字グループ

+0

'@" \ s {2、} "はやや効率的です。 –

+0

@ OlivierJacot-descombesなぜそれがより効率的になるか(本当に面白い) – JaredPar

+0

すべての単一の空白を別の空白で置き換える必要はありません。しかし、 '\ t'を' '" 'で置き換えることはありません。 –

5
using System.Text.RegularExpressions; 

newString = Regex.Replace(oldString, @"\s+", " "); 
1

文字列トリミング= Regex.Replace(オリジナル、@ "\ sの+"、 "「);

リファレンス - があり、これを達成するために何のビルドにおける方法ではありませんが、あなたは正規表現を使用することができますhttp://www.dotnetperls.com/regex-replace-spaces

1

string result = Regex.Replace(str, @"\s+", " "); 
1

私は少し異なるアプローチを使用します。ちょっと言い方が変わりました(そして現在VBで)が、それは簡単にカテゴリの記号や句読点や組み合わせなどのすべての種類の除外を行うことができます。また、私は正規表現を学ばなくてもいいです。

Imports System.Runtime.CompilerServices 
Imports System.Globalization 
Imports System.Text 

Public Module StringExclusions 

     <Extension()> Public Function CharsToString(ByVal val As IEnumerable(Of Char)) As String 
      Dim bldr As New StringBuilder() 
      bldr.Append(val.ToArray) 
      Return bldr.ToString() 
     End Function 

     <Extension()> Public Function RemoveCategories(ByVal val As String, ByVal categories As IEnumerable(Of UnicodeCategory)) As String 
      Return (From chr As Char In val.ToCharArray Where Not categories.Contains(Char.GetUnicodeCategory(chr))).CharsToString 
     End Function 

     Public Function WhiteSpaceCategories() As IEnumerable(Of UnicodeCategory) 
      Return New List(Of UnicodeCategory) From {UnicodeCategory.SpaceSeparator, UnicodeCategory.LineSeparator, UnicodeCategory.Control} 
     End Function 
     '...Other commonly used categories removed for brevity. 
    End Module 

そしていくつかのテスト。

[TestMethod] 
    public void RemoveCharacters() 
    { 
     String testObj = "a \a b \b c \f d \n e \r f \t g \v h"; 
     Assert.AreEqual(@"abcdefgh", testObj.RemoveCategories(Strings.WhiteSpaceCategories())); 
    } 

    [TestMethod] 
    public void KeepValidCharacters() 
    { 
     String testObj = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`[email protected]#$%^&*()_+[]\{}|;':,./<>?" + "\""; 
     Assert.AreEqual(@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`[email protected]#$%^&*()_+[]\{}|;':,./<>?" + "\"", testObj.RemoveCategories(Strings.WhiteSpaceCategories())); 
    } 
0

あなたは正規表現を使用せずに、より高速な代替品を試すことができます(ラインターミネータは、タブが同様に処理されます)これを行うには

string replaced = String.Join(" ", str.Split(
    new char[] { ' ', '\t', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries)); 
+0

Regex以外の方法が提供されているRegexベースの回答よりも高速であるという証拠を提供できますか? – DavidRR

-1

最速と一般的な方法を。 Regexの強力な機能は、この問題を解決するために本当に必要ではありませんが、Regexはパフォーマンスを低下させる可能性があります。

String 
.Join 
(" ",  
    new string 
    (stringToRemoveWhiteSpaces 
     .Select 
     (
     c => char.IsWhiteSpace(c) ? ' ' : c 
    ) 
     .ToArray<char>() 
) 
    .Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries) 
) 
+0

コードのみの回答を避ける –

関連する問題