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

如何移除字符串中的数字但保留括号?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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:11:08