C#中使用~分割字符串结果不符的技术求助
解决C#中按~分割字符串并保留指定元素前缀的问题
你的问题在于用Split结合RemoveEmptyEntries时,不仅会去掉连续~产生的空项,还会把分隔符~本身完全丢弃,所以得到的结果都是不带~的内容。要实现你期望的输出,可以试试这两种方法:
方法一:分割后手动为指定元素添加~
如果确定前两个元素需要带~,后面的保持原样,这种方法直接易懂:
string spl = "~ALLERGIST~~ALLERGIST345~Add Specialty~ALLERGIST"; // 先分割并过滤空项,得到原始的四个元素 var rawElements = spl.Split('~').Where(item => !string.IsNullOrEmpty(item)).ToList(); var elements = new List<string>(); for (int i = 0; i < rawElements.Count; i++) { // 前两个元素添加~前缀,其余保持原样 if (i < 2) { elements.Add($"~{rawElements[i]}"); } else { elements.Add(rawElements[i]); } } // 后续处理逻辑 foreach (string item in elements) { cmb.Items.FindItemByValue(item).Checked = true; }
运行后elements的内容就是:
- ~ALLERGIST
- ~ALLERGIST345
- Add Specialty
- ALLERGIST
方法二:用正则表达式精准匹配(更灵活)
如果你的字符串结构是:带~前缀的元素是被1个或多个~开头的,而不带~的是单个~开头的普通内容,可以用正则来直接提取符合要求的项:
using System.Text.RegularExpressions; string spl = "~ALLERGIST~~ALLERGIST345~Add Specialty~ALLERGIST"; // 匹配两种模式:1个/多个~后跟非~字符;单个~后跟非~字符 var matches = Regex.Matches(spl, @"(~{1,2}[^~]+)|~([^~]+)"); var elements = new List<string>(); foreach (Match match in matches) { if (match.Groups[1].Success) { // 对于多~开头的项,只保留一个~前缀 elements.Add($"~{match.Groups[1].Value.TrimStart('~')}"); } else if (match.Groups[2].Success) { // 单个~开头的项,去掉~前缀 elements.Add(match.Groups[2].Value); } } // 后续处理逻辑 foreach (string item in elements) { cmb.Items.FindItemByValue(item).Checked = true; }
这种方法更灵活,哪怕字符串结构变化(比如前三个元素是多~前缀),只要调整正则或判断逻辑就能适配。
另外提个小优化:你的原始代码里Convert.ToString(spl)是多余的,因为spl本身就是string类型,直接用就行啦。
内容的提问来源于stack exchange,提问作者Rahul Aggarwal
相关产品推荐
相关产品推荐

