Split a string by another string in C#
我一直在使用Split()方法来拆分字符串,但这似乎只在您按字符拆分字符串时有效。有没有一种方法可以拆分一个string,另一个字符串是split by参数?
我试过将拆分器转换为字符数组,但运气不好。
换言之,我想拆分string:
THExxQUICKxxBROWNxxFOX
通过xx返回一个值为:
THE, QUICK, BROWN, FOX
- 对于未来的问题:下面的一条评论让我很感兴趣,所以我决定打开一个关于软件工程的讨论,讨论如何在接受的答案中以非必然(但正确)的方式进行。
要按字符串拆分,必须使用字符串数组重载。
1 2 3
| string data ="THExxQUICKxxBROWNxxFOX";
return data .Split(new string[] {"xx" }, StringSplitOptions .None); |
- 事实上,我改变答案的原因有两个:1:要处理我想做的拆分,我需要使用regex.escape,因为我的拆分字符串通常包含星号等。2:虽然我正在编写的程序不需要真正的优化,但使用regex split方法似乎会带来额外的开销。
- 在我的辩护中,乔恩·斯基特建议在用字符串拆分字符串时使用regex作为分隔符,我不得不承认当他建议某个东西时,我倾向于认为这很少是坏建议。('虽然您可能希望按字符串而不是字符进行拆分,但在这种情况下,您将希望看起来像atregex.split')
- @彼得:在那篇文章中,乔恩建议这样做是因为海报没有固定的分隔符;他希望分割由"多个空格"分隔的字符串(意思是2+)。对于由模式而不是值分隔的字符串,regex是一个很好的(好的,唯一的)选项。对于固定值分隔符,它引入了不必要的开销。尝试运行一个测试;随着操作数量的增加,regex最终会占用大约10倍于相应的string.Split的时间。
- 好的,我知道了,德克萨斯州的信息。我必须承认,在性能敏感的环境中,我从不需要string.split。
- 我从Python来到C。python支持由另一个字符串拆分的字符串。我经常需要回到这个问题上,简单地回答一下string[] Split(string pattern),这是我能想到的最自然的用法,但它并不存在。我以前写过C,所以我习惯于使用字符数组,但我仍然不喜欢看到char[]在C代码中弹出,因为它突然将我的注意力从流级别拖到字节级别。有人知道为什么C图书馆的人设计了这样的分割方法吗?如果有一个很好的理由,尽管有不便,我还是会尽力去感激。
- 这段代码在我向非C开发人员展示的东西列表中排名非常高。
- 为什么我们不能就这么做呢?
- @因为数据过载,所以Matteo.Split应该是char[]。应该是data.Split("xx".ToCharArray())。
- @Adamrobinson我有字符串id,name,"addess 1, city",但我需要的结果是id和name 和address 1, city。
- 为什么?在什么样的拆分用例中,您希望将字符串视为字符数组而不是简单的字符串?如果我有one; two; three,我想由";"而不是char[] { ';', ' ' }分割。
- @Meer,您可以使用textfieldParser。
- @你启发了我。在问题评论中添加了一个链接,指向有关该主题的讨论。我以为你会感兴趣。干杯!
- 这样做可以保存一些字符并关闭重新分析:data.Split(new [] {"xx" }, StringSplitOptions.None);。如果经常使用这个方法,那么可能值得创建自己的分割方法。有点像public static string[] Split(this string text, string[] seperator) { return text.Split(seperator, StringSplitOptions.None); }。
需要字符串的拆分超载。
1
| "THExxQUICKxxBROWNxxFOX".Split(new [] {"xx" }, StringSplitOptions .None); |
您可以使用以下任一字符串拆分选项
- 无-返回值包括数组包含空字符串的元素
- removeEmptyEntries-返回值不包括数组元素包含空字符串
因此,如果字符串是"thexxquickxxxxbrownxxfox",那么StringSplitOptions.None将在数组中为"xxxx"部分返回一个空条目,而StringSplitOptions.RemoveEmptyEntries将不会返回。
- 您不需要在new之后指定字符串:"THExxQUICKxxBROWNxxFOX".Split(new[] {"xx" }, StringSplitOptions.None);将起作用。
- 修好了,谢谢。旧密码是旧的。
1
| Regex.Split(string,"xx") |
是我通常做的方式。当然你需要一个
1
| using System.Text.RegularExpressions; |
但我还是一直需要那个图书馆。
- @布兰登:虽然我通常警告不要过早优化,但您应该知道,由于正则表达式开销,RegEx.Split比简单的string.Split要贵得多。
- 如果要按任意字符串拆分,请首先在字符串上使用Regex.Escape,这将转义任何regex元字符。
- 可能会支付开销的一个主要优势是能够提供字符串比较设置
字符串过载。为此拆分:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| "THExxQUICKxxBROWNxxFOX".Split(new [] {"xx
<div class="suo -content ">[collapse title=""]<ul><li>唯一删除不必要的数组类型声明的答案。</li></ul>[/collapse]</div><hr>
<p>
I generally like to use my own extension for that:
</p>
[cc lang="csharp "]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以支持多个分隔符。
前面的答案都是正确的。我更进一步,通过在字符串上定义一个扩展方法,使C为我工作:
1 2 3
| public static string[] Split (this string toSplit, string splitOn ) {
return toSplit .Split(new string[] { splitOn }, StringSplitOptions .None);
} |
这样,我就可以用简单的方式在任何字符串上调用它,我天真地希望第一次尝试实现这一点时:
1
| "a big long string with stuff to split on".Split("g str"); |
1 2 3
| string data ="THExxQUICKxxBROWNxxFOX";
return data.Replace("xx","|").Split('|'); |
只需仔细选择替换字符(选择一个不可能已经出现在字符串中的字符)!
- @Masoudhosseini:请阅读完整的答案;已经有免责声明了。
- @科比:因为这是一个可怕的黑客。
- 工作正常,但对于一般方法是危险的
- 张贴诸如"这是一个可怕的黑客"或"一个糟糕的答案"的解释是没有帮助的。这只是一个没有解释的意见。相反,声明"不必同时扫描字符串中的替换字符,然后再扫描拆分字符,因为这会导致性能下降。"这将是更好的自我解释方法。太多程序员这样做。:(
- 如果字符串已经包含了|字符,那么我认为使用它是危险的。
- @AMD:答案是一个模板,不一定强制使用|。我希望你能阅读脚注免责声明和其他评论。
- 我正在使用这个xd,太糟糕了.net没有单字符串拆分问题的重载。
这也很简单:
1 2
| string data ="THExxQUICKxxBROWNxxFOX";
string[] arr = data.Split("xx".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); |
- 但这也会把我们不希望分割的东西一分为二
- 谢谢拉法隆:是的,格雷格的答案是最好的:data.split(new string[]"xx",stringssplitoptions.removeEmptyEntries)
最简单的方法是使用String.Replace:
1 2
| string myString ="THExxQUICKxxBROWNxxFOX";
mystring = mystring.Replace("xx",","); |
或者更简单地说:
1
| string myString ="THExxQUICKxxBROWNxxFOX".Replace("xx",","); |
- 实际上,它不会返回数组(如问题所要求的那样),只返回一个字符串,其中包含逗号,其中xx的位置。
- 不仅如此,如果字符串包含额外的逗号,您将无法正确地拆分单词。