分割字符串','除了','在()

本文关键字:除了 分割 字符串 | 更新日期: 2023-09-27 18:05:37

我有一个字符串像

"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"

我想用字符'拆分它,但我不喜欢在'()'中包含','。请帮助如何在c#中分割这样的字符串。忽略字符',' within ().

输出应该像:

   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" 

等。

分割字符串','除了','在()

如果模式是总是,那么您可以使用regulareexpression来分割分隔符(逗号)而不是匹配标记。识别作为分隔符的逗号需要一个相对简单的操作:

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

演示: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;
}

代码不是可测试的,可能包含错误。如果你找到了,请随意编辑我的答案

这是作品

 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;
    }

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

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)

注:当然,您也可以编写您的解析器:

    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);

输出与上面的示例相同