簡體   English   中英

將','中的字符串分割為()中除','以外的數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM