用C#中的另一个字符串分割一个字符串


680

我一直在使用该Split()方法来分割字符串,但这仅在您按字符分割字符串时才起作用。有没有一种方法可以拆分string,而另一个字符串是按参数拆分?

我试过将拆分器转换为字符数组,但是没有运气。

换句话说,我想拆分string

THEXXQUICKxxBROWNxxFOX

通过xx,并返回具有值的数组:

THE,QUICK,BROWN,FOX


2
对于未来的担忧:以下评论之一使我感兴趣,因此我决定就公认的答案中涉及非直观(但正确)方法的软件工程展开讨论
scharette

Answers:


1237

为了按字符串分割,您必须使用字符串数组重载

string data = "THExxQUICKxxBROWNxxFOX";

return data.Split(new string[] { "xx" }, StringSplitOptions.None);

4
实际上,出于以下两个原因,我最终更改了答案:#1:要处理拆分,我将需要使用Regex.Escape,因为拆分字符串通常包含星号,等等。#2:在此程序中我写的内容不需要真正的优化,使用Regex Split方法似乎确实涉及额外的开销。
布兰登

7
@Peter:在该帖子中,乔恩建议这样做是因为张贴者没有固定的定界符;他希望拆分用“多个空格”(表示2+)分隔的字符串。对于用模式而不是定界的字符串,RegEx是一个很好的选择(也是唯一的选择)。对于固定值定界符,它会引入不必要的开销。尝试运行测试;随着操作次数的增加,RegEx最终会花费约10倍的时间,只要相应的string.Split
亚当·罗宾逊

9
我从Python到C#。Python支持将字符串除以另一个字符串。而且,我经常需要回到这个问题,以获取对的简单答案string[] Split(string pattern),这是我能想到的最自然的用法,但目前还没有。我之前写过C,所以我习惯于使用char数组,但是我仍然讨厌看到char[]C#代码弹出,因为它突然将我的注意力从流级别转移到了字节级别。有人知道为什么C#库人员设计这样的Split方法吗?如果有充分的理由,尽管给您带来不便,我还是可以尝试欣赏。
foresightyj 2015年

11
对于不向非C#开发人员展示的内容,此代码片段的排名很高。
Traubenfuchs 2015年

98
我们到底为什么不能做data.Split("xx")呢?
mcont

122

有一个带字符串的Split重载

"THExxQUICKxxBROWNxxFOX".Split(new [] { "xx" }, StringSplitOptions.None);

您可以使用这些StringSplitOptions中的任何一个

  • -返回值包括包含空字符串的数组元素
  • RemoveEmptyEntries-返回值不包括包含空字符串的数组元素

因此,如果字符串为“ THExxQUICKxxxxBROWNxxFOX”,StringSplitOptions.None则将在数组中为“ xxxx”部分返回一个空条目,而StringSplitOptions.RemoveEmptyEntries不会。


73
Regex.Split(string, "xx")

通常是我这样做的方式。


当然,您需要:

using System.Text.RegularExpressions;

要么 :

System.Text.RegularExpressions.Regex.Split(string, "xx")

但是我又一直需要那个图书馆。


13
@Brandon:虽然我通常会提防过早的优化,但是您应该意识到,由于正则表达式的开销,a RegEx.Split比简单的要昂贵得多String.Split
亚当·罗宾逊

9
如果要分割任意字符串,Regex.Escape请先在该字符串上使用,这将转义任何正则表达式元字符。
理查德2010年

可能需要支付开销的主要优势之一是能够提供字符串比较设置
Timur Sadykov 2014年


25

我通常喜欢使用自己的扩展名:

string data = "THExxQUICKxxBROWNxxFOX";
var dataspt = data.Split("xx");
//>THE  QUICK  BROWN  FOX 


//the extension class must be declared as static
public static class StringExtension
{   
    public static string[] Split(this string str, string splitter)
    {
        return str.Split(new[] { splitter }, StringSplitOptions.None);
    }
}

但是,如果Microsoft决定在更高版本中包括此方法重载,则会导致异常。这也是Microsoft同时未包含此方法的可能原因:我工作过的至少一家公司在其所有C#项目中都使用了这种扩展。

如果该方法不存在,则有可能在运行时有条件地定义该方法。


4
可替代地,使用params string[] splitter作为第二个参数,并改变new[] {splitter}splitter支持多个定界符。
Matthew Strawbridge 2014年

10

先前的答案都是正确的。我更进一步,通过在String上定义扩展方法,使C#为我工作:

public static class Extensions
{
    public static string[] Split(this string toSplit, string splitOn) {
        return toSplit.Split(new string[] { splitOn }, StringSplitOptions.None);
    }
}

这样,我可以以我第一次尝试完成此操作时幼稚的简单方式在任何字符串上调用它:

"a big long string with stuff to split on".Split("g str");


7
string data = "THExxQUICKxxBROWNxxFOX";

return data.Replace("xx","|").Split('|');

只需仔细选择替换字符即可(选择字符串中不太可能存在的替换字符)!


2
@MasoudHosseini:请阅读完整答案;已经有免责声明。
SNag 2015年

3
@kobe:因为这是一个可怕的骇客。
Overv 2015年

3
效果很好,但对于通用方法
却很

5
发布诸如“这是骇人听闻的骇客”或“错误答案”之类的说明无济于事。这只是一个没有解释的意见。而是说类似“不必扫描字符串以进行替换,然后扫描拆分字符,因为这会导致性能下降”。会是一个更好的自我解释方式。这样的程序员太多了。:(
马特·鲁

1
如果字符串|已经包含char 怎么办,因此我认为使用该字符串很危险。
AMD公司

-1

这也很容易:

string data = "THExxQUICKxxBROWNxxFOX";
string[] arr = data.Split("xx".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

1
但这也会"THExQUICK"在我们不希望分割的地方分割
Rafalon

谢谢拉法隆:是的,格雷格是最好的答案:data.Split(new string [] {“ xx”},StringSplitOptions.RemoveEmptyEntries)
user890255

-4

最简单的方法是使用String.Replace

string myString = "THExxQUICKxxBROWNxxFOX";
mystring = mystring.Replace("xx", ", ");

或更简单地说:

string myString = "THExxQUICKxxBROWNxxFOX".Replace("xx", ", ");

3
照原样,它不会返回数组(如问题所要求的),而只是返回带有逗号的字符串(位于xx)。
Arj 2014年

不仅如此,如果字符串包含其他逗号,您将无法正确分割单词。
user3658298 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.