using System.Collections.Generic; using System.Text; namespace AddInPlugin.Util { public class ExpressUtil { /// /// 按逗号分割字符串,忽略引号内的逗号 /// /// 输入字符串 /// 是否去除每项首尾空格 /// 是否移除空项 /// 分割后的数组 public static string[] SplitIgnoringQuotes(string input, bool trim = false, bool removeEmpty = true, char escapeChar = '\\') { if (string.IsNullOrEmpty(input)) return new string[0]; List result = new List(); StringBuilder current = new StringBuilder(); bool inQuotes = false; int parenDepth = 0; // 圆括号嵌套深度 int bracketDepth = 0; // 方括号嵌套深度 for (int i = 0; i < input.Length; i++) { char c = input[i]; // 处理转义引号:\" 表示引号字符本身,不是引号边界 if (c == escapeChar && i + 1 < input.Length && input[i + 1] == '"') { current.Append('"'); i++; // 跳过下一个字符(引号字符) continue; } // 处理引号边界 if (c == '"') { inQuotes = !inQuotes; current.Append(c); continue; } // 如果在引号内,直接添加字符 if (inQuotes) { current.Append(c); continue; } // 处理圆括号 if (c == '(') { parenDepth++; current.Append(c); continue; } else if (c == ')') { if (parenDepth > 0) parenDepth--; current.Append(c); continue; } if (c == '[') { bracketDepth++; current.Append(c); continue; } else if (c == ']') { if (bracketDepth > 0) bracketDepth--; current.Append(c); continue; } // 处理逗号分隔符(不在引号内,不在括号内,不在方括号内) if (c == ',' && parenDepth == 0 && bracketDepth == 0) { AddItem(result, current, trim, removeEmpty); current.Clear(); continue; } // 其他字符,直接添加 current.Append(c); } // 添加最后一项 AddItem(result, current, trim, removeEmpty); return result.ToArray(); } private static void AddItem(List result, StringBuilder current, bool trim, bool removeEmpty) { string item = trim ? current.ToString().Trim() : current.ToString(); if (!removeEmpty || !string.IsNullOrEmpty(item)) result.Add(item); } } }