如何清理字符串多余空白、保留数值关联特殊字符并移除无效特殊符号
字符串特殊字符清理最优实现方案
原有实现的核心问题
- 拆分单词时直接用特殊字符做分隔符,会把普通文本中间合法的特殊字符(比如
note-book中的-、I've中的')直接清除,不符合需求 - 没有处理货币符号和数字分开为两个单词的场景(比如示例中的
$ 900.45),会误将$判定为普通特殊字符清除 - 先移除所有特殊字符再判断是否为数值的逻辑误差较大,容易出现误判
推荐方案:分两步正则处理
不需要拆分单词做复杂判断,直接通过正则区分数值关联片段和普通文本片段分开处理,执行效率更高,边界场景兼容性更好:
- 第一步:先识别所有符合规则的数值相关片段(包含前后允许的特殊字符与空格),直接保留不做清理
- 第二步:对剩下的普通文本片段,仅移除首尾的特殊字符,保留中间的合法特殊字符
具体实现代码
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
相关产品推荐
相关产品推荐

