【问题标题】:Splitting a string in C#在 C# 中拆分字符串
【发布时间】:2011-03-10 03:42:10
【问题描述】:

假设我有这个字符串:

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

...我想把它分成:

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

我使用了 split 函数,当然它会在每个逗号处拆分它。有没有办法使用正则表达式来做到这一点,还是我必须编写自己的拆分函数?

【问题讨论】:

    标签: c# .net regex split


    【解决方案1】:

    就个人而言,我会尝试这样的事情:

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

    基本上,使用正向预测来查找逗号,然后是“键值”对(这由键、冒号和更多信息 [数据](包括其他逗号)定义。这应该取消资格数字之间的逗号也是如此。

    【讨论】:

    • Demo 在这里找到:ideone.com/Xa7YR -- 不过,这也需要更好地格式化信息。无论哪种方式,我认为这不会比人类解析它更成功(但也许至少让你思考)。
    • 布拉德,这就是我正在寻找的东西,如果不是很接近,但我认为这可以。非常感谢您的帮助!!!
    • @DavidSunderland:没问题,希望它至少能让你在其中取得好成绩。但如果没有某种形式的模式,就很难分辨什么是“数据”逗号,什么是分隔符。
    • 仅供参考,最后的.*? 完全没用;它总是匹配零个字符。该解决方案仍然有效,因为您不需要 匹配冒号后的任何内容。
    【解决方案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
    

    【讨论】:

      【解决方案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=上输入了多个逗号。
      【解决方案4】:

      这取决于。除非您可以确定将一组与另一组分开的一致规则,否则您无法使用正则表达式(或其他任何内容)对其进行解析。根据您的样本,我无法清楚地识别出这样的规则(尽管我有一些猜测)。系统怎么知道p:myparameters=1,2,3是单项?例如,如果后面有另一个项目,那和1,2,3 有什么区别?弄清楚这一点,您将非常接近解决方案。

      如果您能够更改输入字符串的格式,为什么不决定在您的组之间使用一致的分隔符? ; 将是一个不错的选择。使用像param1;r:1234;p:myparameters=1,2,3 这样的输入,组的位置不会有歧义,而且您可以在; 上拆分,并且不需要正则表达式。

      【讨论】:

        【解决方案5】:

        最简单的方法是将分隔符从“,”更改为“|”。然后你可以在“|”上拆分没问题。但是,如果您无法更改分隔符,那么您可以使用类似于 CSV 的方式对这些部分进行编码。

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

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

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

        TextFieldParser

        【讨论】:

          【解决方案6】:

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

          【讨论】:

          • 感谢 Aaron 的回复,但我不希望 1,2,3 被拆分。
          猜你喜欢
          • 2021-08-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多