如何实现支持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
相关产品推荐
相关产品推荐

