在C#中分割字符串

4
假设我有如下字符串:
"param1,r:1234,p:myparameters=1,2,3" 

我希望您能够将其拆分为以下内容:

param1
r:1234
p:myparameters=1,2,3

我已经使用了split函数,当然它会在每个逗号处分割。有没有一种使用正则表达式来实现这个功能的方法,或者我必须编写自己的split函数?

6个回答

2

个人来说,我会尝试像这样做:

,(?=[^,]+:.*?)

基本上,使用正向先行查找来查找逗号,后面跟随一个“键值”对(由键,冒号和更多信息[数据](包括其他逗号)定义)。这应该也排除了数字之间的逗号。


演示在这里找到:http://www.ideone.com/Xa7YR -- 尽管如此,这也需要更好的格式。无论如何,我认为这不会比人类解析更成功(但也许至少能让你思考)。 - Brad Christie
Brad,这就是我要找的东西,如果不是非常接近,但我认为这样做就可以了。非常感谢你的帮助!!! - David Sunderland
1
@DavidSunderland:没问题,希望它至少能让你走得更远。但是如果没有某种形式的模式,很难区分哪个逗号是“数据”逗号,哪个是分隔符。 - Brad Christie
顺便提一下,末尾的 .*? 完全没有用处;它总是匹配零个字符。但这个解决方案仍然有效,因为你不需要在冒号后面匹配任何内容。 - Alan Moore

2
你可以使用分号(;)来分隔值,这样更容易处理。

由于逗号(,)用于分隔和表示值,因此很难进行拆分。

你有:

string str = "param1,r:1234,p:myparameters=1,2,3"

建议使用

string str = "param1;r:1234;p:myparameters=1,2,3"

可以拆分为

var strArray = str.Split(';');

strArray[0];  // contains param1
strArray[1];  // r:1234
strArray[2];  // p:myparameters=1,2,3

1

感谢丹尼尔的回复。是的,这是一个来自最终用户的奇怪需求。这就是我在这里的原因。我没想到这个人会在p:myparameters=中输入多个逗号。 - David Sunderland

1
那要看情况。除非你能确定一致的规则来区分一个组和另一个组,否则你无法使用正则表达式(或其他任何东西)来解析它。根据你提供的示例,我无法清楚地确定这样的规则(尽管我有一些猜测)。系统如何知道p:myparameters=1,2,3是一个单独的项目?例如,如果它后面还有另一个项目,那么它和1,2,3之间有什么区别?找出答案,你就接近解决方案了。
如果你能够更改输入字符串的格式,为什么不决定在组之间使用一致的分隔符呢?;是一个不错的选择。使用像param1;r:1234;p:myparameters=1,2,3这样的输入,就不会存在组的歧义,而且你只需要按;进行分割,就不需要使用正则表达式了。

1

最简单的方法是将分隔符从“,”更改为类似“|”的字符。然后您可以轻松地按“|”拆分。但是,如果您无法更改分隔符,则可以以类似于CSV的方式对部分进行编码。

CSV文件也有同样的问题...标准做法是在列周围加上双引号""。

例如,您的字符串将是“param1”,“r:1234”,“p:myparameters=1,2,3”。

然后,您可以使用Microsoft.VisualBasic.FileIO.TextFieldParser进行拆分/解析。即使它在VisualBasic命名空间中,您也可以在c#中包含它。

TextFieldParser


0
你的意思是:string[] str = System.Text.RegularExpression.Regex.Spilt("param1,r:1234,p:myparameters=1,2,3",@"\,");

谢谢回复,Aaron,但我不想让1、2、3分开。 - David Sunderland

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