C#中如何忽略空格类型实现字符串松散比较?
解决方案
首先纠正你之前的错误:你调用.Replace(@"\x0020", " ")是无效的,因为@"\x0020"是字符串字面量(包含\x0020这6个字符),而非实际的Unicode普通空格(0x0020)。要解决多种相似空白字符的匹配问题,推荐以下两种通用方案:
1. 统一标准化空白字符(推荐)
创建一个扩展方法,将所有Unicode空白分隔符(包括普通空格、非断空格、en空格、em空格等)统一替换为普通空格,之后再进行字符串比较:
using System.Text.RegularExpressions; public static class StringExtensions { public static string NormalizeWhitespace(this string input) { if (string.IsNullOrEmpty(input)) return input; // \p{Zs}匹配所有Unicode空格分隔符 return Regex.Replace(input, @"\p{Zs}", " ").Trim(); } }
使用方式:
var expectedResult = "foo bar"; if (actualResult.NormalizeWhitespace() == expectedResult.NormalizeWhitespace()) { // 执行逻辑 }
这种方式能一次性处理所有类型的空白字符,适合你需要匹配多个识别键的场景。
2. 自定义字符串比较器
如果需要频繁进行这类松散比较,可以实现自定义StringComparer,避免重复标准化字符串:
using System.Text.RegularExpressions; public class LooseWhitespaceComparer : StringComparer { public override int Compare(string x, string y) { if (x == null && y == null) return 0; if (x == null) return -1; if (y == null) return 1; var normalizedX = NormalizeWhitespace(x); var normalizedY = NormalizeWhitespace(y); return string.Compare(normalizedX, normalizedY, StringComparison.Ordinal); } public override bool Equals(string x, string y) { if (x == null && y == null) return true; if (x == null || y == null) return false; var normalizedX = NormalizeWhitespace(x); var normalizedY = NormalizeWhitespace(y); return normalizedX.Equals(normalizedY); } public override int GetHashCode(string obj) { return obj == null ? 0 : NormalizeWhitespace(obj).GetHashCode(); } private static string NormalizeWhitespace(string input) { return Regex.Replace(input, @"\p{Zs}", " ").Trim(); } }
使用方式:
var comparer = new LooseWhitespaceComparer(); if (comparer.Equals(actualResult, expectedResult)) { // 执行逻辑 } // 若用字典存储识别键,可直接传入比较器 var keyActions = new Dictionary<string, Action>(comparer) { { "foo bar", () => { /* 对应逻辑 */ } }, { "test key", () => { /* 其他逻辑 */ } } }; if (keyActions.TryGetValue(actualResult, out var action)) { action.Invoke(); }
临时应急方案(仅针对单个空格类型)
如果只需要处理普通空格(0x0020)和非断空格(0x00A0)的替换,可直接替换对应字符:
// 将实际结果中的普通空格替换为非断空格,与预期匹配 if (actualResult.Replace('\u0020', '\u00A0') == expectedResult) { // 执行逻辑 }
但这种方式仅覆盖单一场景,不推荐用于多识别键的松散比较需求。
内容的提问来源于stack exchange,提问作者Daniël Camps
相关产品推荐
相关产品推荐

