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

Posted

技术标签:

【中文标题】在 C# 中用另一个字符串拆分一个字符串【英文标题】:Split a string by another string in C# 【发布时间】:2010-02-11 15:24:15 【问题描述】:

我一直在使用Split() 方法来拆分字符串,但这似乎只在您按字符拆分字符串时才有效。有没有办法拆分string,而另一个字符串是按参数拆分的?

我尝试将拆分器转换为字符数组,但没有成功。

也就是说,我想拆分string

THExxQUICKxxBROWNxxFOX

xx,并返回一个包含值的数组:

THE、QUICK、BROWN、FOX

【问题讨论】:

对于未来的担忧:以下评论之一引起了我的兴趣,因此我决定开设一个discussion 关于软件工程的关于非直观(但正确)的方法来做到这一点接受的答案。 【参考方案1】:

要按字符串拆分,您必须使用string array overload。

string data = "THExxQUICKxxBROWNxxFOX";

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

【讨论】:

我实际上最终出于两个原因改变了我的答案:#1:要处理我想要做的拆分,我需要使用 Regex.Escape,因为我的拆分字符串通常包含星号,等 #2:虽然我正在编写的这个程序不需要真正的优化,但使用 Regex Split 方法似乎确实会产生额外的开销。 @Peter:在那篇文章中,乔恩建议这样做,因为海报没有固定的分隔符;他正在寻找用“多个空格”(意思是 2+)分隔的字符串。对于由 pattern 而不是 value 分隔的字符串,RegEx 是一个很好的(嗯,only)选项。对于固定值分隔符,它引入了不必要的开销。尝试运行测试;随着操作数量的增加,RegEx 最终占用的时间大约是对应的 string.Split 的 10 倍左右。 我从 Python 到 C#。 Python 支持字符串被另一个字符串分割。而且我经常需要回到这个问题来简单回答string[] Split(string pattern),这是我能想到的最自然的用法,但它不存在。我之前写过 C,所以我习惯于 char 数组,但我仍然讨厌看到 char[] 在 C# 代码中弹出,因为它突然将我的注意力从流级别拖到字节级别。有人知道为什么 C# 库的人会设计这样的 Split 方法吗?如果有充分的理由,尽管给您带来不便,我可能会尝试感谢它。 这个 sn-p 在我羞于向非 C# 开发人员展示的东西列表中排名很高。 为什么我们不能只做data.Split("xx")【参考方案2】:

编辑:请参阅@Danation 对更新/更少冗长重载的回答


有一个overload of Split 接受字符串。

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

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

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

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

【讨论】:

它并不完全“接受”字符串。它需要一个字符数组,您只需为此使用文字构造函数。 @SvenMawby Nah,它“从字面上”对“字符串”的“数组”有一个“重载”。 Split(String[], StringSplitOptions)【参考方案3】:
Regex.Split(string, "xx")

是我通常这样做的方式。


你当然需要:

using System.Text.RegularExpressions;

或:

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

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

【讨论】:

@Brandon:虽然我通常会提醒不要过早优化,但您应该知道,RegEx.Split 比简单的 String.Split 成本要高得多,因为正则表达式开销。 如果你想用任意字符串分割,首先在字符串上使用Regex.Escape,这将转义任何正则表达式元字符。 可以支付开销的主要优势之一是能够提供字符串比较设置【参考方案4】:

String.Split 过载:

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

【讨论】:

删除不必要的数组类型声明的唯一答案。【参考方案5】:

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

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 决定在以后的版本中包含此方法重载,这将导致异常。这也是微软在此期间没有包含这种方法的可能原因:至少我工作过的一家公司在他们所有的 C# 项目中都使用了这种扩展。

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

【讨论】:

或者,使用params string[] splitter作为第二个参数并将new[] splitter更改为splitter以支持多个分隔符。【参考方案6】:

从 .NET Core 2.0 开始,有一个接受字符串的覆盖。

所以现在你可以"THExxQUICKxxBROWNxxFOX".Split("xx")

见https://docs.microsoft.com/en-us/dotnet/api/system.string.split?view=netcore-2.0#System_String_Split_System_String_System_StringSplitOptions_

【讨论】:

【参考方案7】:

前面的答案都是正确的。我更进一步,通过在 String 上定义 extension method 让 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");

【讨论】:

【参考方案8】:
string data = "THExxQUICKxxBROWNxxFOX";

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

仔细选择替换字符(选择一个不太可能出现在字符串中的字符)!

【讨论】:

@MasoudHosseini:请阅读完整答案;已经有免责声明。 @kobe:因为这是一个可怕的 hack。 工作正常,但对泛型方法很危险 发布诸如“这是一个可怕的黑客攻击”或“一个糟糕的答案”之类的解释是没有帮助的。这只是一个没有解释的意见。相反,声明类似“没有必要同时扫描字符串以查找替换,然后扫描拆分字符,因为这会导致性能下降。”将是一个更好的方式来解释自己。太多的程序员这样做了。 :( 如果字符串已经包含| 字符怎么办,因此我认为使用它很危险。【参考方案9】:

先创建这个函数。

string[] xSplit(string str, string sep) 
    return str.Split(new [] sep, StringSplitOptions.None);

然后像这样使用它。

xSplit("THExxQUICKxxBROWNxxFOX", "xx");

【讨论】:

【参考方案10】:

这也很简单:

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

【讨论】:

但这也会拆分"THExQUICK",我们不希望它被拆分 感谢 Rafalon:是的,Greg 是最好的答案:data.Split(new string[] "xx" , StringSplitOptions.RemoveEmptyEntries)【参考方案11】:

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

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

或者更简单地说:

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

【讨论】:

事实上,这不会返回一个数组(正如问题所要求的那样),只是一个带逗号的字符串,xx 所在的位置。 不仅如此,如果字符串包含额外的逗号,您将无法正确拆分单词。 他在做点什么。如果你也用一个拆分链接它。怀疑它是否有效,但它更具可读性.. var myStrings = "THExxQUICKxxBROWNxxFOX".Replace("xx", "|").Split('|'); @Terje。如果已经有一些“|”怎么办在起始字符串中?

以上是关于在 C# 中用另一个字符串拆分一个字符串的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中的两个特殊字符之间拆分分层字符串

在 C++ 中用字符串和 int 解析(拆分)一个 txt 文件

在python中用分隔符拆分一个字符串

如何将子字符串拆分为多个块并使用 C# 将它们输入到表中?

C# 正则表达式拆分但如果拆分失败则包含空字符串

c#中的字符串拆分返回一个空数组