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

如何清理字符串多余空白、保留数值关联特殊字符并移除无效特殊符号

字符串特殊字符清理最优实现方案

原有实现的核心问题

  • 拆分单词时直接用特殊字符做分隔符,会把普通文本中间合法的特殊字符(比如note-book中的-、I've中的')直接清除,不符合需求
  • 没有处理货币符号和数字分开为两个单词的场景(比如示例中的$ 900.45),会误将$判定为普通特殊字符清除
  • 先移除所有特殊字符再判断是否为数值的逻辑误差较大,容易出现误判

推荐方案:分两步正则处理

不需要拆分单词做复杂判断,直接通过正则区分数值关联片段和普通文本片段分开处理,执行效率更高,边界场景兼容性更好:

  1. 第一步:先识别所有符合规则的数值相关片段(包含前后允许的特殊字符与空格),直接保留不做清理
  2. 第二步:对剩下的普通文本片段,仅移除首尾的特殊字符,保留中间的合法特殊字符

具体实现代码

using System.Text.RegularExpressions;

public class StringCleaner
{
    // 允许出现在数值前后/中间的特殊字符:货币符号、小数点、千分符、负号
    private const string AllowedNumericChars = @"#₹$€£₽¥,.-";
    // 数值匹配规则:支持前后带允许的特殊字符+可选空格,中间支持整数/带小数的数字
    private static readonly Regex NumericPattern = new Regex($@"[{Regex.Escape(AllowedNumericChars)}]*\s*\d+(?:[.,]\d+)?\s*[{Regex.Escape(AllowedNumericChars)}]*", RegexOptions.Compiled);
    // 普通文本首尾特殊字符清理规则:仅清理首尾非字母/数字/允许的中间特殊字符
    private static readonly Regex TrimSpecialCharsPattern = new Regex(@"^[^a-zA-Z0-9'-]+|[^a-zA-Z0-9'-]+$", RegexOptions.Compiled);

    public static string CleanString(string input)
    {
        // 先处理多余空格,和你原有逻辑保持一致
        var cleaned = Regex.Replace(input, @"\s+", " ").Trim();
        
        // 先保留所有数值相关片段,再处理普通单词的首尾特殊字符
        return NumericPattern.Replace(cleaned, match => match.Value)
            .Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries)
            .Select(word => TrimSpecialCharsPattern.Replace(word, ""))
            .Where(s => !string.IsNullOrEmpty(s))
            .Aggregate((a, b) => $"{a} {b}");
    }
}

示例验证

输入:"My 14 \" Apple - laptop (note-book) price is $ 900.45 but [I've paid only 900 $"
输出:"My 14 \" Apple laptop note-book price is $ 900.45 but I've paid only 900 $"
完全符合你给出的预期结果。

内容的提问来源于stack exchange,提问作者Tech Learner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 01:45:00