2012-03-03 93 views
4

我有一个字符串,其间有空白字符(\t,\n\n或空格)的未知组合。例如:修整字符串中的空白字符

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

我想用一个空格来代替内空白字符每个序列:

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

是否.NET提供了一个内置的方式做到这一点?如果没有,我怎么能通过C#做到这一点?

回答

4

尝试使用以下正则表达式替换

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

这用一个空格替换每个组的空白字符(\s)。您可以在这里找到其他有用的字符组

+0

'@“\ s {2,}”'可能会更有效一些。 – 2012-03-03 00:56:30

+0

@ OlivierJacot-Descombes为什么会更有效率(真正好奇) – JaredPar 2012-03-03 00:57:25

+0

因为它不需要用另一个单独的空格替换所有单个空格。但它不会用''“'替换'\ t'。 – 2012-03-03 01:00:53

5
using System.Text.RegularExpressions; 

newString = Regex.Replace(oldString, @"\s+", " "); 
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

您能否提供证据证明您的非正则表达式方法比提供的基于正则表达式的答案更快? – DavidRR 2016-05-10 14:42:06

-1

最快的和通用的方式。 Regex强大的工具并不需要解决这个问题,但Regex可以降低性能。

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

避免代码只有答案 – 2017-07-24 12:41:34