ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

换句话说,我想拆分 string

THExxQUICKxx棕色NxxFOX

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

THE, QUICK, 棕色, 狐狸

对于未来的担忧:以下评论之一引起了我的兴趣,因此我决定在软件工程方面开设一个discussion,涉及在接受的答案中以非直观(但正确)的方式来完成它。

A
Adam Robinson

为了按字符串拆分,您必须使用 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 方法吗?如果有充分的理由,尽管不便,我可能会尝试感谢它。
这个片段在我羞于向非 C# 开发人员展示的事物列表中排名非常靠前。
为什么我们不能只做data.Split("xx")
G
Greg

编辑:请参阅@Danation's answer for newer/less versbose 重载

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

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

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

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

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

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


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

是我通常这样做的方式。

当然你需要:

using System.Text.RegularExpressions;

或者 :

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

但话又说回来,我一直都需要那个图书馆。


@Brandon:虽然我通常会提醒不要过早优化,但您应该知道,由于正则表达式开销,RegEx.Split 比简单的 String.Split 成本要高得多。
如果要按任意字符串拆分,请先在字符串上使用 Regex.Escape,这将转义任何正则表达式元字符。
可能支付开销的关键优势之一是能够提供字符串比较设置
b
bruno conde

String.Split 的重载:

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

删除不必要的数组类型声明的唯一答案。
L
Lorenz Lo Sauer

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

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 以支持多个分隔符。
D
Danation

从 .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_


M
Matt

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

S
SNag
string data = "THExxQUICKxxBROWNxxFOX";

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

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


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

先创建这个函数。

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

然后像这样使用它。

xSplit("THExxQUICKxxBROWNxxFOX", "xx");

u
user890255

这也很容易:

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

但这也会在我们不希望它被拆分的地方拆分 "THExQUICK"
谢谢 Rafalon:是的,Greg 是最好的答案:data.Split(new string[] { "xx" }, StringSplitOptions.RemoveEmptyEntries)
C
Cole Tobin

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

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

或者更简单地说:

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

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