将字符串’,’拆分为数组,除了’,’在()中

我有字符串

"11,Standard(db=S,api=Standard),UI,1(db=1,api=STANDARD),Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36,1010,9999,1000,9998.0,,1" 

我想用char’拆分它,’但我不想在’()’中加入’,’。 请帮助如何在c#中拆分这样的字符串。 在()中忽略char’,’。

输出应该像:

  array of string = [ "11", "Standard(db=S,api=Standard)", "UI", "1(db=1,api=STANDARD)", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36", "1010" 

等等

如果模式始终是您可以使用RegularExpression分割分隔符(逗号)而不是匹配标记。 识别分隔符的逗号需要相对简单:

 ",(?=[^\)]*(?:\(|$))" 

演示: https : //dotnetfiddle.net/GgboVn

说明: http : //regexr.com/3bgfj

这是一个解析器

 public static IEnumerable Parse(string Input) { int depth = 0; StringBuilder Line = new StringBuilder(); foreach (char item in Input) { if (depth == 0 && item == ',') { yield return Line.ToString(); Line = new StringBuilder(); } else { Line.Append(item); if (item == '(') { depth++; } if (item == ')') { depth--; } } } if (Line.Length > 0) yield return Line.ToString(); } 

用途:

 var result = Parse(input); 

这是一个简单直接的解析器。 不是防弹,根据您的需要,可能需要进行一些修改:

 static void Main(string[] args) { var toSplit = "11,Standard(db=S,api=Standard),UI,1(db=1,api=STANDARD),Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36,1010,9999,1000,9998.0,,1"; var list = new List(); var isInside = 0; var currentPart = string.Empty; for (int i = 0; i < toSplit.Length; i++) { var chr = toSplit[i]; switch (chr) { case ',': if(isInside == 0) { list.Add(currentPart); currentPart = string.Empty; } break; case '(': isInside++; currentPart += chr; break; case ')': isInside--; currentPart += chr; break; default: currentPart += chr; break; } } foreach (var part in list) { Console.WriteLine(part); } Console.ReadLine(); } 

这应该做你想要的。 它会在任何括号之外的delimitter处将输入分开

 static IEnumerable SplitStringMyWay(string text, char delimitter) { string[] internalItems = text.Split(delimitter); List theItems = new List(); string newItem = string.Empty; int openParenthesis = 0; foreach (string item in internalItems) { if (openParenthesis != 0) newItem += ","; newItem += item; openParenthesis += GetCharCount('(', item); openParenthesis -= GetCharCount(')', item); if (openParenthesis == 0) { theItems.Add(newItem); newItem = string.Empty; } } return theItems; } static int GetCharCount(char value, string text) { int count = 0; foreach (char character in text) { if (character == value) { count++; } } return count; } 

代码不是testet,可能包含错误。 如果您觉得可以随意编辑我的答案

这是有效的

  var values = "11,Standard(db=S,api=Standard),UI,1(db=1,api=STANDARD),Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36,1010,9999,1000,9998.0,,1"; var splitList = GetSplitList(values); public static List GetSplitList(string values) { var splitList = new List(); var retValue = string.Empty; foreach (var value in values.Split(',')) { if (!string.IsNullOrEmpty(retValue) && !value.Contains(")")) { retValue += string.Format("{0},", value); continue; } if (value.Contains("(")) { retValue += string.Format("{0},", value); continue; } if (value.Contains(")")) { retValue += value; splitList.Add(retValue); retValue = string.Empty; continue; } splitList.Add(value); } return splitList; } 

IMO最简单的方法是首先使用','拆分字符串,然后将’(’和’)’符号连接在一起:

 string value = @"11,Standard(db=S,api=Standard),UI,1(db=1,api=STANDARD),Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36,1010,9999,1000,9998.0,,1"; List list = new List(); string[] temp = value.Split(','); for (var i = 0; i < value.Split(',').Length; i++) { if (temp[i].Contains('(')) continue; if (temp[i].Contains(')')) { list.Add(temp[i - 1] + temp[i]); continue; } list.Add(temp[i]); } foreach (var item in list) Console.WriteLine(item); 

输出:

 11 Standard(db=S,api=Standard) UI 1(db=1,api=STANDARD) 

PS当然你也可以写你的解析器:

  static string[] MySplit(string dirty, char delimiter = ',', string ignoreInside = "()") { StringBuilder sb = new StringBuilder(); bool sectionStarted = false; List result = new List(); for (int i = 0; i < dirty.Length; i++) { if (!sectionStarted && dirty[i] == delimiter) { result.Add(sb.ToString()); sb.Clear(); continue; } if (ignoreInside.Contains(dirty[i])) sectionStarted = dirty[i] == ignoreInside[0]; sb.Append(dirty[i]); } return result.ToArray(); } 

用法: var result = MySplit(value);

输出与上面的例子相同。