[英]Split string by ',' into array except ',' within ()
我有像
"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<string> 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<string>();
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<string> SplitStringMyWay(string text, char delimitter)
{
string[] internalItems = text.Split(delimitter);
List<string> theItems = new List<string>();
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,可能包含錯誤。 如果您可以隨意修改我的答案
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<string> list = new List<string>();
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<string> result = new List<string>();
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);
輸出與上面的示例相同。
這是作品
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<string> GetSplitList(string values)
{
var splitList = new List<string>();
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.