2016-10-13 196 views
-4

尽管有很多关于字符串拆分的文章,但我找不到解决我的问题的东西。 我需要将一个字符串拆分成一个数组,但字符串在某些字段上(通常是带有分隔符的值)具有分隔符。c#拆分字符串与一些分隔符和分隔符

字符串类似:

约翰: “2016年10月15日”: “15点二十〇分十四秒”: “经理人”

如果我运行:

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

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

任何方式的拆分功能ca处理这个?

编辑: 的6项是:

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

我期待的时间(十五点20分14秒),是一个项目。

+1

当您拆分它时会出现什么结果?这6个项目是什么? – PrestonM

+0

@PrestonM我猜想“额外”项目是由“:”分割的时间元素(分钟,秒)。 –

+0

根据你的标准,它应该分成6个项目 - 你可以使用:“ – Jivan

回答

2

恕我直言,你需要一个2状态的解析器:内部引号和外部引号。

存在着库,例如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. 空元素不需要保留