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

Bra*_*don 630 .net c# string split

我一直在使用这种Split()方法来分割字符串,但这只有在你用字符分割字符串时才会起作用.有没有办法拆分string,另一个字符串是按参数拆分?我已经尝试将分割器转换为字符数组,没有运气.

换句话说,我想分开string:

THExxQUICKxxBROWNxxFOX

by xx,并返回一个值为的数组:

THE,QUICK,BROWN,FOX

Ada*_*son 1153

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

string data = "THExxQUICKxxBROWNxxFOX";

return data.Split(new string[] { "xx" }, StringSplitOptions.None);
Run Code Online (Sandbox Code Playgroud)

  • 为什么我们不能只做`data.Split("xx")`? (91认同)
  • 这个片段在我非常羞于向非C#开发者展示的事物列表中排名很高. (10认同)
  • 我来自Python到C#.Python支持用另一个字符串拆分字符串.而且我经常需要回到这个问题来回答一个简单的回答`string [] Split(string pattern)`,这是我能想到的最自然的用法,但它并不存在.之前我写过C,所以我习惯了char数组,但我仍然不愿意看到`char []`在C#代码中弹出,因为它突然把我的注意力从流级别拖到了字节级别.有谁知道为什么C#库的人设计像这样的Split方法?如果有充分的理由,尽管不方便,我可能会尝试欣赏它. (8认同)
  • @Peter:在那篇文章中,Jon建议这样做,因为海报上没有固定的分隔符; 他希望拆分由"多个空间"(意思是2+)分隔的字符串.对于由*pattern*而不是*value*分隔的字符串,RegEx是一个很好的(嗯,*only*)选项.对于固定值分隔符,它引入了不必要的开销.尝试运行测试; 随着操作次数的增加,RegEx最终会占据大约10倍,与对应的`string.Split`一样长. (7认同)
  • 我实际上最终改变了我对此的回答有两个原因:#1:要处理我要做的拆分,我需要使用Regex.Escape,因为我的拆分字符串通常包含星号等.#2:虽然这个程序我写的不需要真正的优化,使用Regex Split方法似乎会产生额外的开销. (4认同)
  • @mcont 我们可以在.net core中按字符串分割。[检查这个答案](/sf/answers/3939935401/) (2认同)

Gre*_*reg 116

Split有一个重载,需要字符串.

"THExxQUICKxxBROWNxxFOX".Split(new [] { "xx" }, StringSplitOptions.None);
Run Code Online (Sandbox Code Playgroud)

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

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

因此,如果字符串是"THExxQUICKxxxxBROWNxxFOX",StringSplitOptions.None则将返回数组中"xxxx"部分的空条目,而StringSplitOptions.RemoveEmptyEntries不会.

  • @SvenMawby 不,它“字面上”对“字符串”的“数组”有“重载”。`分割(字符串[],StringSplitOptions)` (3认同)

Pet*_*ter 66

Regex.Split(string, "xx")
Run Code Online (Sandbox Code Playgroud)

是我通常这样做的方式.当然你需要一个

using System.Text.RegularExpressions;
Run Code Online (Sandbox Code Playgroud)

但是我一直都需要那个lib.

  • @Brandon:虽然我经常提醒不要过早优化,但你应该知道,由于正则表达式开销,`RegEx.Split`比简单的`String.Split`要贵得多. (10认同)
  • 如果你想用任意字符串拆分,首先在字符串上使用`Regex.Escape`,这将转义任何正则表达式元字符. (8认同)

bru*_*nde 43

String.Split有一个重载:

"THExxQUICKxxBROWNxxFOX".Split(new [] {"xx"}, StringSplitOptions.None);
Run Code Online (Sandbox Code Playgroud)


Lor*_*uer 22

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 或者,使用`params string [] splitter`作为第二个参数,并将`new [] {splitter}`更改为`splitter`以支持多个分隔符. (3认同)

Dan*_*ion 11

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


SNa*_*Nag 8

string data = "THExxQUICKxxBROWNxxFOX";

return data.Replace("xx","|").Split('|');
Run Code Online (Sandbox Code Playgroud)

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

  • 发布解释,如"这是一个可怕的黑客"或"一个糟糕的答案"是没有帮助的.这只是一个没有解释的意见.取而代之的是,声明"扫描字符串以进行替换然后扫描分裂字符是不必要的,因为它会导致性能不佳." 这将是一个更好的解释自己的方式.太多程序员就是这样做的.:( (4认同)
  • @MasoudHosseini:请阅读完整的答案; 已有免责声明. (2认同)
  • @kobe:因为这是一个可怕的黑客. (2认同)
  • 工作正常,但对于通用方法很危险 (2认同)
  • 如果字符串已经包含 `|` 字符怎么办,因此我认为使用它是危险的。 (2认同)

arg*_*yle 7

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

public static string[] Split(this string toSplit, string splitOn) {
    return toSplit.Split(new string[] { splitOn }, StringSplitOptions.None);
}
Run Code Online (Sandbox Code Playgroud)

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

"a big long string with stuff to split on".Split("g str");
Run Code Online (Sandbox Code Playgroud)