4

我有一个字符串,单词之间的空白字符(或空格)组合\t未知\n。例如:

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

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

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

.NET 是否提供了一种内置方式来执行此操作?如果没有,我怎么能通过 C# 做到这一点?

4

7 回答 7

5
using System.Text.RegularExpressions;

newString = Regex.Replace(oldString, @"\s+", " ");
于 2012-03-03T00:27:55.197 回答
4

尝试以下正则表达式替换

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

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

于 2012-03-03T00:25:55.617 回答
1

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

参考 - http://www.dotnetperls.com/regex-replace-spaces

于 2012-03-03T00:28:12.280 回答
1

没有内置方法可以实现这一点,但您可以使用正则表达式:

string result = Regex.Replace(str, @"\s+", " ");
于 2012-03-03T00:31:26.477 回答
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`12334567890-=~!@#$%^&*()_+[]\{}|;':,./<>?"  + "\"";
        Assert.AreEqual(@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`12334567890-=~!@#$%^&*()_+[]\{}|;':,./<>?" + "\"", testObj.RemoveCategories(Strings.WhiteSpaceCategories()));
    }
于 2012-03-03T02:38:39.610 回答
0

您可以在不使用 Regex 的情况下尝试更快的替代方案:

string replaced = String.Join(" ", str.Split(
   new char[] { ' ', '\t', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries));
于 2012-03-03T03:18:31.687 回答
-1

执行此操作的最快和通用方法(也将处理行终止符、制表符)。Regex 强大的工具并不真正需要解决这个问题,但 Regex 会降低性能。

String  
.Join
(" ",     
  new string  
  (stringToRemoveWhiteSpaces
      .Select
      (
         c => char.IsWhiteSpace(c) ? ' ' : c
      )
      .ToArray<char>()
  )
  .Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries)
)
于 2017-07-24T12:21:47.200 回答