【问题标题】:Trim whitespace characters from within a string从字符串中修剪空白字符
【发布时间】:2012-03-21 11:33:48
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c# .net string removing-whitespace


    【解决方案1】:
    using System.Text.RegularExpressions;
    
    newString = Regex.Replace(oldString, @"\s+", " ");
    

    【讨论】:

      【解决方案2】:

      尝试以下正则表达式替换

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

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

      【讨论】:

      • @"\s{2,}" 可能会更有效率。
      • @OlivierJacot-Descombes 为什么这样会更有效率(真正的古玩)
      • 因为它不必用另一个单个空格替换所有单个空格。但是它不会用" " 替换\t。
      • @OlivierJacot-Descombes 我认为必须替换 \t 以保持 OP 概述的语义。虽然不是 100% 清楚,但我就是这么读的。
      • 是的,这样就可以@"\s{2,}|\t|\n"。但是,这可能不值得复杂。
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          我使用了稍微不同的方法。有点罗嗦(目前在 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()));
              }
          

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

            • 您能否提供证据证明您的非正则表达式方法比提供的基于正则表达式的答案更快?
            【解决方案7】:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-06-23
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-10-26
              • 1970-01-01
              相关资源
              最近更新 更多