在C#中按另一个字符串拆分字符串

842
我一直在使用Split()方法来分割字符串,但这似乎只适用于按字符分割字符串。是否有一种方法可以使用另一个字符串作为分隔符来拆分string
我尝试将拆分器转换为字符数组,但没有成功。
换句话说,我想通过xx拆分string

THExxQUICKxxBROWNxxFOX

并返回值数组:

THE,QUICK,BROWN,FOX


6
未来的考虑:以下评论之一引起了我的兴趣,因此我决定在软件工程方面开启一次讨论,讨论有关接受答案中所述的非直观(但正确)的操作方式。 - scharette
11个回答

1508
为了按字符串分割,您需要使用字符串数组重载
string data = "THExxQUICKxxBROWNxxFOX";

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

4
由于两个原因,我最终改变了对此的答案:#1:为了处理我想要进行的分割,我需要使用Regex.Escape,因为我的分割字符串通常会包含星号等字符。#2:虽然我正在编写的程序不需要真正的优化,但是使用Regex Split方法似乎存在额外的开销。 - Brandon
7
@Peter:在那篇帖子中,Jon是因为发帖人没有固定的分隔符而建议使用这种方法;他想要拆分由“两个或以上的空格”分隔的字符串。对于由模式而不是分隔的字符串,正则表达式是一个很好(实际上是唯一)的选择。对于固定值分隔符,使用正则表达式会带来不必要的开销。可以运行一个测试,随着操作数量的增加,正则表达式所需时间约为相应的string.Split的~10倍。 - Adam Robinson
9
我曾使用Python,现在开始学习C#。在Python中,可以通过另一个字符串来分割字符串。我经常需要回到这个问题,并希望简单地使用“string[] Split(string pattern)”方法来解决,这是我能想到的最自然的用法,但它在C#中不存在。我之前写过C,所以我习惯使用字符数组,但我仍然不希望在C#代码中看到“char[]”出现,因为它会突然将我的注意力从流级别转移到字节级别。有人知道为什么C#库的设计者会这样设计Split方法吗?如果有一个好的理由,尽管不方便,我可能会尝试欣赏它。 - foresightyj
18
这段代码在我不想向非 C# 开发人员展示的事情列表中排名很高。 - ASA
159
为什么我们不能只使用 data.Split("xx") 进行操作? - mcont
显示剩余5条评论

156

编辑:请参考@Danation的答案获取较新/更简洁的方法重载。


Split函数有一个接受字符串参数的重载

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

你可以使用以下任意一个 StringSplitOptions:

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

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


它并不完全“接受”字符串。它期望一个字符数组,你只是使用了字面构造函数。 - Sven Mawby
3
@SvenMawby 不,它“真的”有一个“字符串”数组的“过载”。Split(String [],StringSplitOptions) - Greg

91
Regex.Split(string, "xx")

通常我这样做。


当然,您需要:

using System.Text.RegularExpressions;
或:
System.Text.RegularExpressions.Regex.Split(string, "xx")

但是话说回来,我一直需要那个库。


16
虽然我通常会警告不要过早地进行优化,但你应该知道,使用正则表达式的 RegEx.Split 比普通的 String.Split 要花费更多,因为需要处理正则表达式的开销。 - Adam Robinson
11
如果您想按任意字符串拆分,请先使用Regex.Escape对该字符串进行转义,这将转义任何正则表达式元字符。 - Richard
其中一个可能支付开销的关键优势是能够提供字符串比较设置。 - Timur Sadykov

52

对于这个问题,有一个 String.Split 的重载:

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

1
唯一的答案是去除不必要的数组类型声明。 - wonea

31

我通常喜欢使用自己的扩展程序来完成这个任务:

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);
    }
}

如果微软决定在后续版本中包含这个方法重载,那么这将导致异常。这也很可能是微软暂时没有将该方法包含在内的原因:我曾经为一个公司工作,在他们所有的 C# 项目中都使用了这样的扩展。

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


4
作为第二个参数,您可以使用“params string[] splitter”,并将“new[] {splitter}”更改为“splitter”,以支持多个分隔符。 - Matthew Strawbridge

19

17

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

前面的回答都是正确的。我更进一步,通过在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
3
因为这是一种糟糕的黑客技术。 - Overv
3
工作正常,但对于通用方法来说是危险的。 - Kaizonaro
8
发布诸如“这是可怕的hack”或“糟糕的答案”的解释是没有帮助的。这只是一个没有解释的观点。相反,像“同时扫描字符串进行替换和扫描分隔符会导致性能差,因此这样做并不必要。” 这样陈述会更好地表达你的意思。太多程序员都以这种方式行事 :( - Matt Ruwe
2
如果字符串已经包含了 | 字符,那该怎么办呢?因此我认为使用它是很危险的。 - amd
显示剩余2条评论

2
首先创建这个函数。
string[] xSplit(string str, string sep) {
    return str.Split(new [] {sep}, StringSplitOptions.None);
}

然后像这样使用它。
xSplit("THExxQUICKxxBROWNxxFOX", "xx");

-2

这个也很简单:

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

2
但这也会将“THExQUICK”分割,而我们不希望它被分割。 - Rafalon
谢谢Rafalon:是的,Greg的回答是最好的:data.Split(new string[] { "xx" }, StringSplitOptions.RemoveEmptyEntries) - user890255

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接