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

如何实现支持InvariantCultureIgnoreCase的子串匹配?

实现支持InvariantCultureIgnoreCase的子串匹配

你遇到的问题根源在于正则表达式的大小写忽略逻辑和StringComparison.InvariantCultureIgnoreCase的逻辑不一致:

  • 正则的RegexOptions.IgnoreCase | RegexOptions.CultureInvariant仅基于Unicode简单大小写映射(单个字符对应单个大小写字符),无法识别像ff(连字)与FF这种多字符的大小写等价关系。
  • 而StringComparison.InvariantCultureIgnoreCase遵循Unicode完全大小写等价规则,会处理字符折叠、连字这类特殊等价场景。

解决方案

使用.NET的CompareInfo类(来自System.Globalization)实现匹配,它支持通过CompareOptions指定与StringComparison.InvariantCultureIgnoreCase一致的比较规则,能正确识别特殊字符的等价关系:

using System.Globalization;

static string InvariantIgnoreCaseSubstringMatch(string searchSubstring, string source)
{
    if (string.IsNullOrEmpty(searchSubstring) || string.IsNullOrEmpty(source))
        return null;

    var compareInfo = CultureInfo.InvariantCulture.CompareInfo;
    var compareOptions = CompareOptions.IgnoreCase | CompareOptions.InvariantCulture;

    // 查找第一个匹配的起始索引
    int startIndex = compareInfo.IndexOf(source, searchSubstring, compareOptions);
    if (startIndex == -1)
        return null;

    // 确定匹配的子串长度(处理搜索串与匹配串长度不同的情况,如ff vs FF)
    int maxLength = source.Length - startIndex;
    for (int length = 1; length <= maxLength; length++)
    {
        string candidate = source.Substring(startIndex, length);
        if (string.Equals(candidate, searchSubstring, StringComparison.InvariantCultureIgnoreCase))
        {
            return candidate;
        }
    }

    return null;
}

测试验证

  • 调用InvariantIgnoreCaseSubstringMatch("ff", "FF")返回"FF"
  • 调用InvariantIgnoreCaseSubstringMatch("abc", "123AbC123")返回"AbC"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 02:50:08