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


242

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

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

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

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


1
这样做:myStr.Split(''); 不行?
woolagaroo 2011年

4
如果我正确理解这一点,它将只搜索一个空格,而不是通用空格

另请参见可能的重复项,但这些稍后的答案都有SplitStringOptions。stackoverflow.com/questions/1562981/…–
goodeye

Answers:


469

如果您仅致电:

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

要么:

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

则假定空白是分隔符。从string.Split(char[])方法的文档页面

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

总是,总是,总是阅读文档!


2
按空格分割的麻烦是,如果必须再次将其放在一起,则不知道要放回哪个空格字符。
Ross Presser 2012年

19
(char[])null稍好一点,因为它避免了创建新对象。(您不能null与任何options重载一起使用)。
Artfunkel

5
@RossPresser:将字符串重新放在一起是一个完全不同的问题,因此在这里我不会说这是一个问题。但是,如果您需要做的只是将字符串完全放回原来的位置,那么最好保留原始字符串。
stakx-不再贡献

4
愚蠢的问题,但如果使用null,是否仍需要指定StringSplitOption.RemoveEmptyEntries或默认情况下将其忽略?
yu_ominae 2013年

2
@RossPresser:由于String.Split不提供任何机制来跟踪用于分割字符串的字符,因此您的观察结果不相关:使用String.Split无法实现您要查找的内容,因此需要进行不同的问答。
制造商史蒂夫(Steve),2015年

207

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

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

String.Split与Regex.Split

当然,如果您不喜欢使用选项,请使用regex替代方法:-)

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

4
我认为,@ RossPresser在“除了最晦涩的场景之外,几乎所有情况下”都包含在我的限定词中,因为即使想要重新组合元素,我也很难承受我关心多个空格的情况。我想要一个规范的形式-每个之间有一个空格。因此,我谨对此表示不同意见-这将是“非常错误”,而不是“通常是错误”。
Michael Sorens

1
CapitalizeEveryWord("This is line one.\n \nThis is line three.")
Ross Presser 2013年

3
如果您真的认为这很晦涩,那么我想我们必须同意不同意,但是如果我将此功能留在软件之外,那我就会丢掉工作。用户喜欢他们的内容看起来像他们想要的样子。
Ross Presser 2013年

4
这应该是一个可以接受的答案,因为它更加完整。
丹尼斯

1
我想知道为什么您添加.Where(s => s != string.Empty)了正则表达式。由于您指定了\s+(任意数量的空格),因此两者之间不能有空项目。
杰克·米勒

44

根据文档

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

因此,只需致电myStr.Split();就不需要传递任何东西了,因为分隔符是一个params数组。


11

您为什么不使用?:

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

2
没有需要两个字符的Split重载。
takrl 2011年

1
@takrl:在这里查看公共字符串[]拆分(参数char []分隔符).NET v2
RenatasM。11年

是的,这需要一个字符数组。您的代码段传递了两个单个字符。
takrl 2011年

15
@takrl:您知道什么是params关键字吗???
Renatas M.

很酷,为此+1。投票否决的人可能也不知道。
takrl 2011年

3

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

从文档中:

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


2

因此,请勿复制和粘贴!提取一个函数进行拆分并重新使用它。

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

代码重用是您的朋友。



1

您可以使用

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

分割字符串。


0

您不能内联吗?

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

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

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

var sizes = subject.Split(null);

0

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


1
抱歉,这确实无法回答问题。
p.campbell 2013年

p。坎贝尔:是的,它是:OP要求一种解决方案,该解决方案不需要在各处复制字符数组。一个明显的解决方案是创建一个函数来执行任务。该答案指出,这样的功能可能是扩展方法。(可以通过显示代码来改善答案……)
ToolmakerSteve 2015年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.