【问题标题】:Best way to specify whitespace in a String.Split operation在 String.Split 操作中指定空格的最佳方法
【发布时间】:2011-05-24 13:39:04
【问题描述】:

我正在根据空格分割一个字符串,如下所示:

string myStr = "The quick brown fox jumps over the lazy dog";

char[] whitespace = new char[] { ' ', '\t' };
string[] ssizes = myStr.Split(whitespace);

在我想要这样做的代码中到处定义 char[] 数组很烦人。有没有更高效的方式不需要创建字符数组(复制到不同地方容易出错)?

【问题讨论】:

  • 这样做:myStr.Split(' ');不工作?
  • 如果我理解正确,这只会搜索空格,而不是通用空格
  • 另见可能重复,但这些后来的答案有SplitStringOptions。 stackoverflow.com/questions/1562981/…

标签: c# string


【解决方案1】:

如果你只是打电话:

string[] ssize = myStr.Split(null); //Or myStr.Split()

或:

string[] ssize = myStr.Split(new char[0]);

然后假设空格是分割字符。来自string.Split(char[]) method's documentation page

如果分隔符参数是null 或不包含任何字符,则假定空白字符是分隔符。空白字符由 Unicode 标准定义,如果将它们传递给 Char.IsWhiteSpace 方法,则返回 true

永远、永远、永远阅读文档!

【讨论】:

  • 用空格分割的麻烦是如果你必须把它重新放在一起,你不知道放回哪个空格字符。
  • (char[])null 稍微好一点,因为它避免了创建新对象。 (您不能将null 与任何options 重载一起使用)。
  • @RossPresser:将字符串重新组合在一起是一个完全不同的问题,所以我不会在这里说这是一个问题。但是,如果您需要做的只是将字符串恢复到原来的样子,那么最好还是保留原来的。
  • 愚蠢的问题,但是如果你使用null,你还需要指定StringSplitOption.RemoveEmptyEntries还是默认忽略它们?
  • @RossPresser:由于 String.Split 没有提供任何机制来跟踪用于拆分字符串的字符,因此您的观察不相关:使用 String.Split 无法实现您所寻求的,所以这需要不同的问答。
【解决方案2】:

是的,这里还需要一个答案!

到目前为止,所有解决方案都解决了规范输入的相当有限的领域,即:单个空格字符 元素(尽管@cherno 至少提到了这个问题)。 但我认为,除了最模糊的场景外,将所有这些应该分开会产生相同的结果:

string myStrA = "The quick brown fox jumps over the lazy dog";
string myStrB = "The  quick  brown  fox  jumps  over  the  lazy  dog";
string myStrC = "The quick brown fox      jumps over the lazy dog";
string myStrD = "   The quick brown fox jumps over the lazy dog";

String.Split(在此处的其他答案中显示的任何风格)根本无法正常工作,除非您将RemoveEmptyEntries 选项与以下任何一个一起附加:

myStr.Split(new char[0], StringSplitOptions.RemoveEmptyEntries)
myStr.Split(new char[] {' ','\t'}, StringSplitOptions.RemoveEmptyEntries)

如图所示,省略该选项会产生四种不同的结果(标记为 A、B、C 和 D),而当您使用 RemoveEmptyEntries 时,会产生所有四个输入的单一结果:

当然,如果您不喜欢使用选项,只需使用正则表达式替代 :-)

Regex.Split(myStr, @"\s+").Where(s => s != string.Empty)

【讨论】:

  • 正如我在之前的评论中提到的,有时您希望在对非空白元素进行操作后将字符串重新组合在一起。在这种情况下,将连续的空格视为单个分隔符通常是错误的。
  • 我认为,@RossPresser,我的限定词“在除了最晦涩的场景之外的所有场景下”都涵盖了这一点,因为即使想要重新组合元素,我也很难遇到这样的情况关心多个空间。我想要一个规范的形式——每个之间有一个空格。所以我恭敬地不同意——这将是“很少错误”而不是“通常错误”。
  • CapitalizeEveryWord("This is line one.\n \nThis is line three.")
  • 如果你真的认为这很模糊,那么我想我们将不得不同意不同意,但如果我将这个功能从我的软件中排除,我就会失去工作。用户喜欢他们的内容看起来像他们想要的样子。
  • 这应该是一个可以接受的答案,因为它更完整。
【解决方案3】:

根据documentation

如果 separator 参数为 null 或不包含任何字符,则假定空白字符为分隔符。空白字符由 Unicode 标准定义,如果将它们传递给 Char.IsWhiteSpace 方法,则返回 true。

所以只需调用 myStr.Split(); 就不需要传入任何内容,因为 分隔符 是一个 params 数组。

【讨论】:

    【解决方案4】:

    你为什么不使用?:

    string[] ssizes = myStr.Split(' ', '\t');
    

    【讨论】:

    • 不存在需要两个字符的拆分重载。
    • @takrl: 看here public string[] Split (params char[] separator) .NET v2
    • 是的,这需要一个字符数组。您的代码 sn-p 传递了两个单个字符。
    • @takrl:你知道params关键字是什么吗???
    • 非常酷,为此 +1。可能投反对票的人也不知道。
    【解决方案5】:

    请注意,即使使用String.Split(null),相邻的空格也不会被视为单个分隔符。如果您的任何标记用多个空格或制表符分隔,您将在数组中返回空字符串。

    来自文档:

    分隔符的每个元素定义一个单独的分隔符。如果 两个分隔符相邻,或者在开头找到一个分隔符 或此实例的结尾,对应的数组元素包含 空。

    【讨论】:

      【解决方案6】:

      所以不要复制粘贴!提取一个函数来进行拆分并重用它。

      public static string[] SplitWhitespace (string input)
      {
          char[] whitespace = new char[] { ' ', '\t' };
          return input.Split(whitespace);
      }
      

      代码重用是你的朋友。

      【讨论】:

        【解决方案7】:

        你可以使用

        var FirstString = YourString.Split().First();

        分割一个字符串并在空格之前得到它的第一次出现。

        【讨论】:

          【解决方案8】:

          你为什么不这样做:

          var ssizes = myStr.Split(" \t".ToCharArray());
          

          .NET 4.0 中似乎有一个方法String.ToCharArray()

          编辑:正如 VMAtm 指出的那样,the method already existed in .NET 2.0!

          【讨论】:

          【解决方案9】:

          你不能内联吗?

          var sizes = subject.Split(new char[] { ' ', '\t' });
          

          否则,如果您经常执行此操作,则始终可以创建常量或包含该 char 数组的内容。

          正如其他人所指出的,您也可以根据文档使用 null 或空数组。当你这样做时,它会自动使用空白字符。

          var sizes = subject.Split(null);
          

          【讨论】:

            【解决方案10】:

            如果重复相同的代码是问题,请在封装拆分逻辑的 String 类上编写扩展方法。

            【讨论】:

            • 这并不能真正回答问题,抱歉。
            • 页。坎贝尔:是的,它确实如此:OP 要求提供一种不需要在任何地方复制字符数组的解决方案。一个明显的解决方案是创建一个函数来完成任务。这个答案指出,这样的功能可能是一种扩展方法。 (答案可以通过显示代码来改进......)
            【解决方案11】:

            你可以这样做:

            string myStr = "The quick brown fox jumps over the lazy dog";
            string[] ssizes = myStr.Split(' ');
            

            MSDN 有更多示例和参考资料:

            http://msdn.microsoft.com/en-us/library/b873y76a.aspx

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2022-06-15
              • 2010-10-25
              • 2010-11-19
              • 2010-10-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多