如何移除字符串中的数字但保留括号?C#扩展方法优化
解决方法:保留括号与字母,仅移除数字及多余空格
你的思路方向是对的,只是原方法的筛选条件太严格——只保留字母,自然会把括号这类非字母字符过滤掉。我们只需要调整筛选逻辑,同时处理掉数字移除后可能产生的多余空格,就能得到想要的结果。
方案1:LINQ+正则组合(简洁直观)
修改扩展方法,先移除所有数字,再清理多余的空格:
public static string ExtractTimeUnits(this string original) { // 第一步:移除所有数字字符 string withoutDigits = new string(original.Where(c => !char.IsDigit(c)).ToArray()); // 第二步:把连续的空格替换成单个空格,并去掉首尾的空格 return System.Text.RegularExpressions.Regex.Replace(withoutDigits, @"\s+", " ").Trim(); }
测试一下你的示例输入:
输入:
15 Hour(s) 10 Day(s) 5 Month(s) 2 Year(s)
输出:Hour(s) Day(s) Month(s) Year(s)
方案2:纯LINQ实现(无需正则)
如果你不想用正则,也可以用LINQ直接处理字符流,同时跳过数字和多余的空格:
public static string ExtractTimeUnits(this string original) { bool lastWasSpace = false; var resultChars = new List<char>(); foreach (char c in original) { // 跳过数字 if (char.IsDigit(c)) continue; // 处理空格:只保留一个连续空格 if (char.IsWhiteSpace(c)) { if (!lastWasSpace) { resultChars.Add(c); lastWasSpace = true; } continue; } // 保留字母和括号 resultChars.Add(c); lastWasSpace = false; } // 去掉最后的空格(如果有的话) if (resultChars.Count > 0 && char.IsWhiteSpace(resultChars.Last())) resultChars.RemoveAt(resultChars.Count - 1); return new string(resultChars.ToArray()); }
这个方法会逐个字符检查:跳过数字,合并连续空格,最后再清理末尾可能的空格,效果和方案1一致。
为什么原方法会移除括号?
原方法里的char.IsLetter(c)只会保留A-Z、a-z这类字母字符,而括号()属于标点符号,不在字母范围内,所以会被过滤掉。我们调整筛选逻辑后,要么明确保留括号(方案2),要么直接排除数字(方案1,因为括号不属于数字,会被保留),就能解决问题啦。
内容的提问来源于stack exchange,提问作者Izzy
相关产品推荐
相关产品推荐

