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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 07:40:21