字符串分割 - 通过多个字符作为分隔符

189
我在C#中使用分隔符"]["时,无法将字符串拆分。
例如字符串 "abc][rfd][5][,][." 应生成包含以下内容的数组: abc rfd 5 , .
但我似乎无法使其正常工作,即使我尝试正则表达式也无法在分隔符上进行分割。
编辑:本质上,我想解决此问题而不需要使用正则表达式。我接受的解决方案是;
string Delimiter = "][";  
var Result[] = StringToSplit.Split(new[] { Delimiter }, StringSplitOptions.None);

我很高兴能够解决这个分裂的问题。


请展示你的代码,说明它在哪里出现了问题。 - Konrad Rudolph
此外,请在您发布的内容之外,也分享一下您从中获得了什么,以及您希望从中获得什么。 - Lasse V. Karlsen
6个回答

310
为了展示如何使用string.SplitRegex,请参考以下代码示例:
string input = "abc][rfd][5][,][.";
string[] parts1 = input.Split(new string[] { "][" }, StringSplitOptions.None);
string[] parts2 = Regex.Split(input, @"\]\[");

8
如果你像我一样对代码的精简有要求:'var parts1 = input.Split(new[] { "][" }, StringSplitOptions.None);' (该代码行用于分割输入字符串) - Paul Grimshaw
3
提供StringSplitOptions.None相较于input.Split(new string[] { "][" })有什么好处? - seebiscuit
1
这意味着,两个字符都存在,是吗?如果我想通过"["或"]"来分割怎么办?从我的测试结果来看,这可能是另一回事,对吧? - C4d
4
@C4u 的代码 String.Split("[]".ToCharArray()) 会根据 [] 分别进行分割。例如:Hello[World]Its[Me! 会被分割为 Hello, World, Its, Me! - Ma Dude
1
似乎需要使用“StringSplitOptions.None”,否则它将尝试使用以字符为参数的方法(但我对此行为感到非常惊讶)。 - azerty

55
string tests = "abc][rfd][5][,][.";
string[] reslts = tests.Split(new char[] { ']', '[' }, StringSplitOptions.RemoveEmptyEntries);

9
请注意,这种方法假定他的意思是在每个"]"和"["上进行分割,即使它们没有出现在"[]"组合中也是如此。 - Lasse V. Karlsen
2
那个重载的string.Split将它视为两个单独的分隔符——简单地丢弃其余部分。有一个重载函数可以接受字符串作为分隔符(实际上是字符串数组)——因此您不必删除空值(也就是说:当数据中存在有效的空值时,你可以找到它们)。 - Marc Gravell
你的假设是正确的。他没有具体说明,所以我给了他一个在他的例子中可以工作的东西。如果他不想跳过它们,那么这个方法就可以。但是没有更多的信息,我们永远不会知道。 - SwDevMan81
这正是我在寻找的。在问题中它是一个简单的问题,但这是一个高级答案。 - Bitterblue
那正是我在寻找的。但正确答案对我来说也是新闻,我不知道你可以像Marc描述的那样用多个字符拆分。语法相当糟糕。 - Piotr Kula

26

另一个选项:

用单个字符替换字符串分隔符,然后在该字符上拆分。

string input = "abc][rfd][5][,][.";
string[] parts1 = input.Replace("][","-").Split('-');

1
这就是我的做法。它给了我一个标准化、通用的方法,可以在所有平台上工作,而不必担心特定于平台的技巧。 - David Betz
7
不是一个好主意。考虑以下代码:string input = "abc][rf-d][5"。"rf-d"中的"-"将被识别为分隔符。请查看上面接受的答案。 - Gilad Barner
在这种情况下,替换为并拆分一个不太可能的字符,例如~或`,甚至是一个非键盘字符,例如 ¿ 或 ◙ 等。 - seabass2020
1
如果解决方案清晰、健壮且可以规范化,我会喜欢它。我的用法是 Dim Levels As New List(Of String)(newSelectedTask.Replace(LevelDelimter, Chr(13)).Split(Chr(13))) - Nasenbaer

3
Regex.Split("abc][rfd][5][,][.", @"\]\]");

1
在.NET Core 2.0及以上版本中,有一个Split重载函数可以实现这个功能:
string delimiter = "][";
var results = stringToSplit.Split(delimiter);

Split (netcore 2.0 版本)


1

更快的方法是直接使用非字符串数组而不是字符串:

string[] StringSplit(string StringToSplit, string Delimitator)
{
    return StringToSplit.Split(new[] { Delimitator }, StringSplitOptions.None);
}

StringSplit("E' una bella giornata oggi", "giornata");
/* Output
[0] "E' una bella giornata"
[1] " oggi"
*/

1
这与11年前接受的答案有何不同? - Heretic Monkey
正因为这个答案非常古老,所以看到这个问题的人将能够找到更近期、也许更有功能性的解决方案。 - Marco Concas
4
“很老的”答案使用了与您更近期和更功能齐全的解决方案相同的代码。无论如何,我的评论的目的是促使您编辑您的答案,并更详细地解释您的代码如何比现有答案更好或不同。 - Heretic Monkey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接