【问题标题】:c# Trim commas until text appearsc# 修剪逗号直到出现文本
【发布时间】:2020-02-23 13:46:31
【问题描述】:

我尝试从字符串中删除所有逗号,但不是全部。我已经在整个论坛中搜索过这个问题,但我找不到解决方案。让我用一个例子来解释一下:

所以基本上,我有一个包含很多行的文件。它们看起来像这样:

,,,,,9,33380,32785,14,,,,,50,,,,,,3,,,,600
,,,,19,33399,32774,14,,,,,50,,,,,,2,,,,600
,,,,19,33399,32784,14,,,,,50,,,,,,3,,,,600
,,,,38,33380,32789,14,,,,,50,,,,,,1,,,,600
,,,,38,33404,32793,14,,,,,50,,,,,,1,,,,600
,,,,79,33394,32795,14,,,,,50,,,,,,2,,,,600
,,,,83,33396,32789,14,,,,,50,,,,,,5,,,,600
,,,100,33399,32779,14,,,,,50,,,,,,3,,,,600
,,,101,33399,32797,14,,,,,50,,,,,,2,,,,600

我想要的输出是在值之间保留一个逗号。并且还从字符串的开头删除任何前导逗号。像这样:

9,33380,32785,14,50,3,600
19,33399,32774,14,50,2,600
19,33399,32784,14,50,3,600
38,33380,32789,14,50,1,600
38,33404,32793,14,50,1,600
79,33394,32795,14,50,2,600
83,33396,32789,14,50,5,600
100,33399,32779,14,50,3,600
101,33399,32797,14,50,2,600

我尝试使用text.Replace(',',''),但随后将它们全部删除。 不幸的是,我也不擅长 RegEx,我什至不知道这是否可能。

任何帮助将不胜感激!

【问题讨论】:

    标签: c# string split


    【解决方案1】:

    您可以使用以下正则表达式将多个逗号压缩为一个,然后使用Trim 删除任何前导或尾随逗号

    var result = Regex.Replace(inpyut, ",+", ",").Trim(',');
    

    【讨论】:

    • 这看起来是合乎逻辑的方法。
    【解决方案2】:

    有几种解决方案

    , 分隔符拆分并删除空条目(',,'),然后使用相同的, 分隔符重建字符串。

    var result = string.Join(",", ",,,,,9,33380,3272774,,".Split(new [] { ',' }, StringSplitOptions.RemoveEmptyEntries);
    

    【讨论】:

    • 非常感谢!它工作得很好!我不知道.JoinStringSplitOptions.RemoveEmptyEntries。太棒了!
    • 顺便问一下,我怎么能把它们分成不同的字符串?所以分隔符是逗号。当我这样做时:var x = result.Split(',')[0]; 我得到了第一个数字。但是当我执行var b = result.Split(',')[1]; 时,我收到一条错误消息:System.IndexOutOfRangeException: 'Index was outside the bounds of the array.' 难道[1] 不应该是第二个单词(在第一个逗号之后)吗?
    • 使用逗号字符拆分字符串,删除所有空条目,然后获取结果并在每个项目之间放置一个逗号。当然可以,但它是 hack ;)
    • 你有这方面的例子吗?我试过使用.First(),然后我得到了第一个值。但是如果我用.Skip(1) 来获得第二个,我会得到同样的错误。我尝试了很多方法来用逗号分割它。好像没用。
    • @juharr 建议的逻辑解决方案是因为任何阅读代码的人都会立即知道,它用一个逗号替换多个逗号并删除前导逗号。自记录代码。 Fiddle。您可以将我的评论视为友好建议或攻击,但这只是友好建议。
    【解决方案3】:

    这是我的解决方案

    text = ",,,,,9,33380,32785,14,,,,,50,,,,,,3,,,,600";
    while (text.Contains(",,"))
    {
        text = text.Replace(",,", ",");
    }
    if (text.Substring(0, 1) == ",") {
        int textLength = text.Length;
        text = text.Substring(1, textLength - 1);
    }
    

    希望对你有帮助:)

    【讨论】:

      【解决方案4】:

      @juharr 的答案看起来不错,但如果性能是一个问题,最好在替换之前修剪并将两个或多个逗号更改为一个。因此给予:

      var result = Regex.Replace(inpyut.Trim(','), ",,+", ",");
      

      【讨论】:

      • 你知道我如何将字符串拆分为多个字符串吗?分隔符是逗号。我现在正在尝试这个,但它不起作用。我可以得到第一个值,但不能得到第二个、第三个、第四个等...var parts = result.Split(','); var a = parts.First(); var b = parts.Skip(1).First();
      • 尝试像(未经测试的)foreach(var ss in result.Split(',')){Console.WriteLine($"<{ss}>");} 这样的代码来查看结果的确切内容。您在 cmets 中的问题没有提供足够的详细信息来了解您为什么会得到意想不到的结果。
      • 每行有7个字符串,用逗号分隔。所以我试着用它制作7根弦。所以字符串 a = 第一个值。字符串 b = 第二个值。每一个都用逗号隔开。您的 foreach 循环将每个单词打印在一行上,但是如何将这些变量添加到名为“a、b、c、d、e、f、g”的字符串中?
      • 所以这里有一个例子。运行您的代码后,我将字符串放入名为“result”的变量中,现在我想将其拆分为更小的字符串,如下所示:string result = "100,33400,32780,13,50,2,600"; string a = "100"; string b = "33400"; string c = "32780";
      • @MJ 您似乎正试图在 cmets 部分提出一个与原始问题无关的新问题。如果您还有其他问题,请创建一个新问题并具体说明您的要求。
      猜你喜欢
      • 2020-12-16
      • 1970-01-01
      • 1970-01-01
      • 2014-03-08
      • 1970-01-01
      • 2013-04-07
      • 1970-01-01
      • 2010-12-07
      • 2020-06-09
      相关资源
      最近更新 更多