You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中如何提取逗号间子串(忽略内部括号)

在C#中提取忽略嵌套括号的逗号分隔子串

这个需求用普通的Split(',')肯定搞不定——它会把括号里的逗号也当成分隔符,把xyz(I,j,k)拆成好几段。咱们得专门处理嵌套的括号,下面给你两种实用的实现方式:

方法一:手动遍历字符(直观易调试)

这种方法的核心思路是跟踪括号的嵌套深度:只有当括号深度为0时,遇到的逗号才是真正的分隔符;括号内部的逗号直接保留。

public static List<string> SplitIgnoringNestedCommas(string input)
{
    var resultSegments = new List<string>();
    var currentSegment = new StringBuilder();
    int bracketDepth = 0;

    // 先去掉输入首尾的括号(如果你的输入不一定带括号,可以注释掉这行)
    string cleanedInput = input.Trim('(', ')');

    foreach (char c in cleanedInput)
    {
        switch (c)
        {
            case '(':
                bracketDepth++;
                currentSegment.Append(c);
                break;
            case ')':
                bracketDepth--;
                currentSegment.Append(c);
                break;
            case ',':
                // 只有括号深度为0时,才把逗号当成分隔符
                if (bracketDepth == 0)
                {
                    resultSegments.Add(currentSegment.ToString().Trim());
                    currentSegment.Clear();
                }
                else
                {
                    currentSegment.Append(c);
                }
                break;
            default:
                currentSegment.Append(c);
                break;
        }
    }

    // 别忘添加最后一段内容
    if (currentSegment.Length > 0)
    {
        resultSegments.Add(currentSegment.ToString().Trim());
    }

    return resultSegments;
}

使用示例

string input = "(ABC,pqr,xyz(I,j,k),lmn)";
var segments = SplitIgnoringNestedCommas(input);

// 按要求格式输出
for (int i = 0; i < segments.Count; i++)
{
    Console.WriteLine($"{i+1}. {segments[i]}");
}

输出结果完全符合你的期望:

  1. ABC
  2. pqr
  3. xyz(I,j,k)
  4. lmn

方法二:正则表达式(代码更简洁)

C#的正则支持平衡组,可以用来匹配嵌套的括号结构。虽然代码短,但正则的可读性稍差,适合对正则熟悉的场景:

using System.Text.RegularExpressions;

public static List<string> SplitWithRegex(string input)
{
    // 正则平衡组匹配嵌套括号,捕获逗号分隔的有效段
    string pattern = @"(?<=^\(|,)([^(),]+|\((?>[^()]+|\((?<depth>)|\)(?<-depth>))*\))(?=,|\)$)";
    MatchCollection matches = Regex.Matches(input, pattern);
    
    var result = new List<string>();
    foreach (Match match in matches)
    {
        result.Add(match.Value.Trim());
    }
    
    return result;
}

两种方法对比

  • 手动遍历:逻辑清晰,容易调试和修改(比如要支持大括号、方括号的话,改起来很方便),适合大多数场景。
  • 正则表达式:代码更紧凑,但可读性低,后期维护成本高,适合快速实现简单的嵌套括号场景。

内容的提问来源于stack exchange,提问作者user8307736

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:16:01