在 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# 中用另一个字符串拆分一个字符串的主要内容,如果未能解决你的问题,请参考以下文章