【问题标题】:C# - Need string in format of characters separated by one and only one commaC# - 需要以一个且只有一个逗号分隔的字符格式的字符串
【发布时间】:2015-10-21 20:58:10
【问题描述】:

我的目标是获取以下格式的字符串:“0, 1, 2, 3, 4, 7, 10” 数字用一个逗号分隔,开头和结尾都没有逗号。

如果我有字符串 "0, 1, 2,,4" 我只想删除出现的两个逗号中的一个,以便留下“0、1、2、4”

我试过.Replace(",,", ",")

但是,问题是我不知道可能有多少个逗号。例如,我可能遇到类似“0,,,,,,,1,,2,3,,,,5”的情况,我需要将其转换为“0,1,2,3,5”

如何使用 C#(.net webforms)完成此任务? 也许与正则表达式有关?但我对这些不太熟悉。那是唯一的方法吗?

【问题讨论】:

    标签: c# regex string replace character


    【解决方案1】:

    您可以用逗号分割字符串,删除空元素,然后将元素重新组合在一起。

    string str = "0,,,,,,,1,,2,3,,,,5";
    var singleComma = string.Join(",", 
        str.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries));
    

    虽然这不使用 RegEx,但它可能会稍微快一些,因为它使用专门为此目的设计的操作,而不是一般的模式匹配。再说一次,除非你有一个非常大的字符串或其中很多,否则任何性能提升都可能无关紧要。

    【讨论】:

    • 我同意,专门编写的字符串方法比正则表达式解析要快。在我的测试中,您的版本快了三倍,但在 100000 次循环中,差异仅为 200 毫秒
    • 我习惯于处理大量数据,因此对性能有内在的偏见。大多数情况下,这种情况下的最佳选择是易于理解和维护的(这取决于开发人员/团队的技能和经验)。
    【解决方案2】:

    很简单

    string test = "0,,,,,,,1,,2,3,,,,5";
    string result = Regex.Replace(test, ",+", ", ");
    

    模式表达式中逗号后面的加号表示

    匹配前一个元素一次或多次。

    MSDN Quick Reference on Regex expressions

    【讨论】:

    • 完美,谢谢!其他回复似乎应该有效,但我选择了这个,因为这对我来说最容易绕过。效果很好!
    【解决方案3】:

    不要删除不需要的字符,而是使用原始字符串中的数字形成一个新的干净字符串。您可以为此使用正则表达式

    string input = "0,,,  .+=/ garbage,,,,1,,2,3,,,,5";
    string output = String.Join(", ", Regex.Matches(input, @"\d+")
                                           .Cast<Match>()
                                           .Select(m => m.Value));
    

    【讨论】:

      【解决方案4】:

      您可以将string.SplitStringSplitOptions.RemoveEmptyEntriesstring.Join 一起使用:

      string input = "0,,,,,,,1,,2,3,,,,5";
      string[] split = input.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
      string result = string.Join(",", split);
      

      【讨论】:

        【解决方案5】:

        这是使用正则表达式的另一种方法。

        您正在寻找一个正则表达式模式\d,?,其中:

        \d 将匹配任何数字,

        并且,? 将匹配字符, 零次或一次。

        Realtime regex here!

        您的代码 sn-p 看起来像:

        using System;
        using System.Collections.Generic;
        using System.Text;
        using System.Text.RegularExpressions;
        
        namespace ConsoleApplication1
        {
            class Program
            {
                static void Main(string[] args)
                {
                    string str = "0,,,,,,,1,,2,3,,,,5";
                    string fstr = "";
                   Regex RegExp = new Regex(@"\d,?");
                   MatchCollection matches = RegExp.Matches(str);
                   foreach (Match match in matches) 
                   {
                       fstr = fstr + match.ToString();
                   }
        
                    Console.Write(fstr);
                    Console.Read();
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-10
          • 1970-01-01
          • 2013-05-31
          • 1970-01-01
          相关资源
          最近更新 更多