【发布时间】:2011-03-10 03:42:10
【问题描述】:
假设我有这个字符串:
"param1,r:1234,p:myparameters=1,2,3"
...我想把它分成:
param1
r:1234
p:myparameters=1,2,3
我使用了 split 函数,当然它会在每个逗号处拆分它。有没有办法使用正则表达式来做到这一点,还是我必须编写自己的拆分函数?
【问题讨论】:
假设我有这个字符串:
"param1,r:1234,p:myparameters=1,2,3"
...我想把它分成:
param1
r:1234
p:myparameters=1,2,3
我使用了 split 函数,当然它会在每个逗号处拆分它。有没有办法使用正则表达式来做到这一点,还是我必须编写自己的拆分函数?
【问题讨论】:
就个人而言,我会尝试这样的事情:
,(?=[^,]+:.*?)
基本上,使用正向预测来查找逗号,然后是“键值”对(这由键、冒号和更多信息 [数据](包括其他逗号)定义。这应该取消资格数字之间的逗号也是如此。
【讨论】:
.*? 完全没用;它总是匹配零个字符。该解决方案仍然有效,因为您不需要 匹配冒号后的任何内容。
您可以使用; 来分隔值,这样可以轻松使用它。
由于您有 , 用于分隔,也用于值,因此很难拆分它。
你有
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
【讨论】:
老实说,我不确定您将如何编写一个知道要在哪个逗号上拆分的拆分。
除非每次都是固定数字,这种情况下就用the String.Split overload that takes an int specifying how many substrings to return at max
如果您要使用逗号分隔的数据,而这些数据并不总是固定数量的项目并且它可能在数据本身中包含文字逗号,那么它们确实应该被引用。如果您可以以任何方式控制输入,则应鼓励这样做,并使用an actual CSV parser 而不是String.Split
【讨论】:
这取决于。除非您可以确定将一组与另一组分开的一致规则,否则您无法使用正则表达式(或其他任何内容)对其进行解析。根据您的样本,我无法清楚地识别出这样的规则(尽管我有一些猜测)。系统怎么知道p:myparameters=1,2,3是单项?例如,如果后面有另一个项目,那和1,2,3 有什么区别?弄清楚这一点,您将非常接近解决方案。
如果您能够更改输入字符串的格式,为什么不决定在您的组之间使用一致的分隔符? ; 将是一个不错的选择。使用像param1;r:1234;p:myparameters=1,2,3 这样的输入,组的位置不会有歧义,而且您可以在; 上拆分,并且不需要正则表达式。
【讨论】:
最简单的方法是将分隔符从“,”更改为“|”。然后你可以在“|”上拆分没问题。但是,如果您无法更改分隔符,那么您可以使用类似于 CSV 的方式对这些部分进行编码。
CSV 文件也有同样的问题...标准是在列周围加上双引号“”。
例如,您的字符串将是“param1”、“r:1234”、“p:myparameters=1,2,3”。
然后您可以使用 Microsoft.VisualBasic.FileIO.TextFieldParser 进行拆分/解析。即使它在 VisualBasic 命名空间中,您也可以在 c# 中包含它。
【讨论】:
你的意思是:string[] str = System.Text.RegularExpression.Regex.Spilt("param1,r:1234,p:myparameters=1,2,3",@"\,");
【讨论】: