在String.Split操作中指定空格的最佳方法

问题描述 投票:199回答:10

我正在基于空格分割字符串,如下所示:

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

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

在我想要执行此操作的代码中定义char []数组是很麻烦的。是否有更有效的方法,不需要创建字符数组(如果在不同的地方复制,容易出错)?

c# string
10个回答
415
投票

如果你只是打电话:

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

要么:

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

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

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

始终,始终,始终阅读文档!


0
投票

你不能在网上做吗?

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

否则,如果你经常这样做,你总是可以创建常量或包含该char数组的东西。

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

var sizes = subject.Split(null);

179
投票

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

到目前为止,所有解决方案都解决了规范输入的相当有限的领域,即:元素之间的单个空白字符(尽管至少提到问题,但是对于@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)

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

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

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

42
投票

根据documentation

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

所以只需调用myStr.Split();没有必要传递任何东西,因为separator是一个params数组。


11
投票

你为什么不用?:

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

3
投票

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

从文档:

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


2
投票

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

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

代码重用是您的朋友。


1
投票

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


1
投票

你为什么不这样做:

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

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

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


0
投票

你可以这样做:

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

© www.soinside.com 2019 - 2024. All rights reserved.