如何在C#中拆分字符串并忽略括号内空格(支持嵌套)
实现带嵌套括号的表达式拆分(C#)
当然可以实现,string.Split(' ')无法满足需求是因为它无法识别括号的嵌套层级,只能做简单的空格分割。我们可以通过手动遍历字符串、跟踪括号深度的方式来实现正确拆分。
实现思路
- 遍历输入字符串的每个字符,维护一个括号深度计数器:遇到
(时计数器+1,遇到)时计数器-1 - 当括号深度为0且遇到空格时,将当前累积的子串作为一个拆分元素,重置累积器
- 遍历结束后,将最后一段累积的子串加入结果集合
- 先对输入字符串做
Trim()处理,避免首尾空格导致的空元素
代码示例
using System.Collections.Generic; using System.Text; public static class ExpressionSplitter { public static string[] SplitNestedExpression(string input) { if (string.IsNullOrWhiteSpace(input)) return new string[0]; input = input.Trim(); List<string> result = new List<string>(); StringBuilder currentSegment = new StringBuilder(); int bracketDepth = 0; foreach (char c in input) { if (c == '(') { bracketDepth++; currentSegment.Append(c); } else if (c == ')') { bracketDepth--; currentSegment.Append(c); } else if (c == ' ' && bracketDepth == 0) { // 仅括号深度为0时的空格才作为分隔符 if (currentSegment.Length > 0) { result.Add(currentSegment.ToString()); currentSegment.Clear(); } } else { currentSegment.Append(c); } } // 添加遍历结束后剩余的最后一段内容 if (currentSegment.Length > 0) { result.Add(currentSegment.ToString()); } return result.ToArray(); } }
测试验证
调用上述方法测试目标场景:
// 测试基础场景 string input1 = "multiply (add 5 5) 5"; string[] output1 = ExpressionSplitter.SplitNestedExpression(input1); // 输出结果:["multiply", "(add 5 5)", "5"] // 测试嵌套括号场景 string input2 = "multiply (add (add 2 5) 5) 5"; string[] output2 = ExpressionSplitter.SplitNestedExpression(input2); // 输出结果:["multiply", "(add (add 2 5) 5)", "5"]
这段代码可以正确处理任意层级的嵌套括号,仅在括号外部的空格处拆分字符串,完全匹配需求。
内容的提问来源于stack exchange,提问作者Kevin Tanudjaja
相关产品推荐
相关产品推荐

