【问题标题】:c# Split string with some delimiters and separatorsc# 用一些分隔符和分隔符分割字符串
【发布时间】:2016-10-13 19:49:42
【问题描述】:

虽然有很多关于字符串拆分的帖子,但我找不到可以解决我的问题的东西。 我需要将一个字符串拆分为一个数组,但该字符串在某些字段上有分隔符(通常是带有分隔符的值)。

字符串看起来像:

约翰:“2016/10/15”:“15:20:14”:“经理”

如果我跑:

string[] items = line.Split(':');

它将字符串分成 6 个项目,而实际上应该只有 4 个。

Split 函数有什么方法可以处理这个问题?

编辑: 这6个项目是:

John
2016/10/15
"15
20
14"
"Manager"

我预计时间 (15:20:14) 是一项。

【问题讨论】:

  • 拆分后的结果是什么?这6个项目是什么?
  • 我认为Split 还不够。也许你应该试试正则表达式?
  • 在我看来,它在每个冒号上都会分开。你到底想摆脱什么?
  • split函数是如何去掉引号的? 6 项是错误的。
  • @CameronCastillo - 你是如何在字符串中存储双引号的?转义字符在哪里?

标签: c# arrays string split


【解决方案1】:

恕我直言,您需要一个具有两种状态的解析器:内引号和外引号。

有像Fast CSV Reader这样的库,可以配置分隔符(:)和引号字符("),甚至可以对引号字符进行转义。

【讨论】:

    【解决方案2】:

    由于第一个元素没有用引号括起来,它确实会在进行干净的拆分时遇到麻烦。如果您不想使用第三方库,这是做一些假设,因为我不知道在您的情况下哪种类型的输入字符串是有效的,即如果第一个元素只是冒号怎么办?

    public void GetElements()
        {
            var delimiter = ":";
            var myStr = "John:\"2016/10/15\":\"15:20:14\":\"Manager\"";
    
            //Split on quotes and remove elements from the array that are the delimter
            var elementArray = myStr.Split(new [] { '"'}, StringSplitOptions.RemoveEmptyEntries);
            elementArray = elementArray.Where(x => x != delimiter).ToArray();
    
            //Scrub the first element to remove the delimiter
            var firstElement = elementArray.ElementAt(0);
            elementArray[0] = firstElement.Remove(firstElement.Length - 1);
    
            foreach(var element in elementArray) Console.WriteLine(element);
    
            Console.ReadKey();
        }
    

    对此的假设是:

    1. 字符串中的第一个“元素”将始终被展开
    2. 字符串上的任何附加元素都将遵循当前的分隔样式,例如John:"2016/10/15":"15:20:14":"Manager":"My new string"
    3. 不需要保留空元素

    【讨论】:

      猜你喜欢
      • 2013-05-03
      • 2020-04-23
      • 2021-06-12
      • 2013-11-24
      • 1970-01-01
      • 2013-08-16
      • 2017-03-25
      相关资源
      最近更新 更多