【问题标题】:Delete certain string from comma delimited string C#从逗号分隔的字符串C#中删除某些字符串
【发布时间】:2021-01-26 07:26:24
【问题描述】:

我有一些不同的输入字符串,例如

string text1 = "Slave 1, Board 3, Point 1, Port 1";
string text2 = "Slave 1, Board 4, Point 1, Port 1";
string text3 = "Slave 1, Board 5, Point 1, Port 1";
string text4 = "Slave 1, Board 6, Point 1, Port 1";
string text5 = "Slave 1, Board 7, Point 4, Port 1";
string text6 = "Slave 1, Board 10, Point 4, Port 1"; 

我需要从每个字符串中删除“Board X”值。怎样才能做到这一点?

文本板后的数字可以不同,但​​名称是静态的。

我写了这样的代码,但它似乎不起作用

List<String> Items = pointPortPath.Split(',').Select(i => i.Trim()).Where(i => i != string.Empty).ToList(); 

Items.Remove(Items.Where(p=>p.StartsWith("Board")).ToString());

【问题讨论】:

  • 到目前为止你做什么?你能把它分成不同的部分吗?找到要删除的部分?去掉它?将其余部分重新组合在一起?帮助我们帮助您并告诉我们您遇到的问题,最好使用您已有的代码。
  • Board 3 不是永久价值,它可以是 Board 10。应该是 LIKE % %
  • 您能否将您的问题编辑得更清楚,然后提供实际的示例输入和输出?请注意,您不是在询问如何删除“某些”字符串,因为您是在询问通配符行为,而不是简单地尝试删除诸如“Board 3”之类的特定值。
  • 抱歉描述太匆忙了,现在改了

标签: c# string csv


【解决方案1】:

您可以为此使用正则表达式:

text1 = System.Text.RegularExpressions.Regex.Replace(text1 ,@"\b(Board) \d\b","");

【讨论】:

  • 它说“无法识别的转义序列”。但我可能修复了它之前添加@。
  • 好。 @hoozr。希望你得到解决方案。如果是这样,请将其标记为答案,以便帮助任何寻找解决方案的人。
  • 这将在输出中留下一个空元素 (Slave 1, , Point 1, ...),这可能不是 OP 的意图(另一方面,OP 没有明确指定所需的输出,所以我可能这里是错误的)。
【解决方案2】:

俗话说:“如果您有一个问题,并且您尝试使用 Regex 解决它,那么现在您有两个问题” - 因此,避免使用 Regex,这里有一个可能对您有用的解决方案。

using System;
using System.Linq;
                    
public class Program
{
    public static void Main()
    {
        string text1 = "Slave 1, Board 3, Point 1, Port 1";
        string text2 = "Slave 1, Board 4, Point 1, Port 1";
        string text3 = "Slave 1, Board 5, Point 1, Port 1";
        string text4 = "Slave 1, Board 6, Point 1, Port 1";
        string text5 = "Slave 1, Board 7, Point 4, Port 1";
        string text6 = "Slave 1, Board 10, Point 4, Port 1";
        
        Console.WriteLine(DeleteBoardFromString(text1));
        Console.WriteLine(DeleteBoardFromString(text2));
    }
    
    public static string DeleteBoardFromString(string input, bool trimWhitespace = true)
    {
        IEnumerable<string> output = input
            .Split(',')
            .Select(str => trimWhitespace ? str.Trim() : str)
            .Where(str => !str.StartsWith("Board"));

        return string.Join(", ", output);
    }
}

输出

从站 1,点 1,端口 1

从站 1,点 1,端口 1

【讨论】:

  • 这个很好的解决方案,谢谢马修!我已经做到了。
  • 很好,但应该注意的是,您的解决方案会将字段分隔符周围的所有空格规范化为, ,即Point 4 , Port 1 将变为Point 4, Port 1。这可能是件好事,但应该记录副作用。
  • @Heinzi 空白修剪的好地方。我已经修改了代码以允许将修剪作为默认行为,但可以将其关闭。也就是说,我怀疑" Board X" 将不再起作用,因为它不再以"Board" 开头:-(
  • 如果不修改空格是一个要求,我可能只为了比较而修剪,即str.Trim().StartsWith("Board")。这样,我们就可以保持所有原始空白不变。
【解决方案3】:

试试这个正则表达式的 Board 后跟任意数字

string target=System.Text.RegularExpressions.Regex.Replace(text1, "Board [0-9]+, ", "");

【讨论】:

    【解决方案4】:
    1. 正则表达式
    using System;
    using System.Text.RegularExpressions;
    
    public class Example
    {
        public static void Main()
        {
            string pattern = @"Board\s\d+,";
            string substitution = @"";
            string input = @"Slave 1, Board 3, Point 1, Port 1
    Slave 1, Board 4, Point 1, Port 1
    Slave 1, Board 5, Point 1, Port 1
    Slave 1, Board 6, Point 1, Port 1
    Slave 1, Board 7, Point 4, Port 1
    Slave 1, Board 10, Point 4, Port 1";
            RegexOptions options = RegexOptions.Multiline;
            
            Regex regex = new Regex(pattern, options);
            string result = regex.Replace(input, substitution);
        }
    }
    

    【讨论】:

      【解决方案5】:

      它适用于

      List<String> Items = pointPortPath.Split(',').Select(i => i.Trim()).Where(i => i != string.Empty).ToList(); 
      
      Items.Remove(x=>x.StartsWith("Board")); 
      

      感谢大家的帮助!

      【讨论】:

        猜你喜欢
        • 2013-01-03
        • 1970-01-01
        • 1970-01-01
        • 2016-04-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-12
        相关资源
        最近更新 更多