在C#中分割字符串

15

我正在尝试以以下方式在C#中拆分字符串:

传入的字符串格式如下:

string str = "[message details in here][another message here]/n/n[anothermessage here]"

我正在尝试将其拆分为字符串数组,形式如下

string[0] = "[message details in here]"
string[1] = "[another message here]"
string[2] = "[anothermessage here]"

我试图以这种方式进行操作

string[] split =  Regex.Split(str, @"\[[^[]+\]");

以这种方式并不能正常工作,我只得到了一个空字符串数组

如果有帮助将不胜感激!


7
“但这样做不起作用” - 请具体说明。您指的是什么?它会抛出异常吗?它是否没有产生预期的结果?如果是这样,它会产生什么样的结果?您可以发表一下吗?请正确提问,否则您很快就会在这里被投票关闭。 - Federico Berasategui
在编程中,使用字符串类的Split()方法重载之一。 - Pieter Geerkens
将所有换行符替换为空字符串,然后在“][”上进行拆分。 - Pieter Geerkens
@PieterGeerkens:这是个好主意,但是如果消息本身包含换行符,它也会将它们删除。 - Guffa
4个回答

24

请使用Regex.Matches方法:

string[] result =
  Regex.Matches(str, @"\[.*?\]").Cast<Match>().Select(m => m.Value).ToArray();

不需要 Cast<Match> - malik masis

17

Split 方法返回指定模式之间的子字符串。例如:

var items = Regex.Split("this is a test", @"\s");

数组中的结果为[ "this", "is", "a", "test" ]

解决方案是使用Matches

var matches =  Regex.Matches(str, @"\[[^[]+\]");

然后您可以使用Linq轻松获取匹配值的数组:

var split = matches.Cast<Match>()
                   .Select(m => m.Value)
                   .ToArray();

你测试了你的 Split 示例吗?除了没有正确转义 \w 之外,你提到的结果完全是错误的。 - Kenneth K.
@KennethK 谢谢。我在走出门的时候写了那篇编辑,没有机会校对它。我已经修复了它。 - p.s.w.g

2
另一个选择是使用“向前/向后查看断言”来进行分割。
例如:
string[] split = Regex.Split(str, @"(?<=\])(?=\[)");

这种方法有效地在关闭和打开方括号之间进行分割。


1

你可以使用字符串的Split方法,而不是使用正则表达式,像这样:

Split(new[] { '\n', '[', ']' }, StringSplitOptions.RemoveEmptyEntries)

使用这种方法,您的结果将失去[],但根据需要将它们添加回来并不难。


这也会在[]之间的\n处中断。我认为这不是OP想要的。 - p.s.w.g

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