如何让String.StartsWith忽略变音符号、重音和波浪符?
解决C#中StartsWith忽略变音符号和大小写的问题
这个问题我之前也碰到过,确实StartsWith的默认重载没法直接传入CompareOptions,但我们可以通过String.Compare方法来实现同时忽略大小写和变音符号的需求,甚至可以封装成扩展方法让用法更贴近原生的StartsWith。
方法1:直接使用String.Compare
String.Compare支持传入CompareOptions参数,我们可以组合IgnoreNonSpace(忽略变音符号、重音等非空格字符)和IgnoreCase(忽略大小写)来实现你的需求。核心思路是比较源字符串和前缀的前N个字符(N是前缀的长度),返回0则表示匹配。
示例代码:
using System.Globalization; string str1 = "microondas"; string str2 = "micrómetro"; string prefix = "micro"; // 比较str1是否以prefix开头(忽略大小写和变音符号) bool comparison1 = String.Compare( str1, 0, prefix, 0, prefix.Length, CultureInfo.InvariantCulture, CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase ) == 0; // 比较str2是否以prefix开头(忽略大小写和变音符号) bool comparison2 = String.Compare( str2, 0, prefix, 0, prefix.Length, CultureInfo.InvariantCulture, CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase ) == 0; // 此时comparison1和comparison2都会返回true
方法2:封装成扩展方法(推荐)
如果需要多次使用这个逻辑,把它封装成扩展方法会更方便,用法和原生StartsWith几乎一致:
using System.Globalization; public static class StringExtensions { public static bool StartsWithIgnoreCaseAndAccents(this string source, string prefix, CultureInfo culture = null) { // 处理边界情况 if (string.IsNullOrEmpty(source)) return string.IsNullOrEmpty(prefix); if (string.IsNullOrEmpty(prefix)) return true; if (prefix.Length > source.Length) return false; // 默认使用InvariantCulture,也可以传入特定文化 culture ??= CultureInfo.InvariantCulture; return String.Compare( source, 0, prefix, 0, prefix.Length, culture, CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase ) == 0; } }
使用示例:
bool comparison1 = str1.StartsWithIgnoreCaseAndAccents("micro"); bool comparison2 = str2.StartsWithIgnoreCaseAndAccents("micro"); // 两者都会返回true
补充说明
CompareOptions.IgnoreNonSpace会把带重音的字符(比如ó、ñ)转换为对应的无重音字符(o、n)进行比较,完全符合你的需求。- 如果你的业务需要基于特定文化(比如西班牙语)进行比较,可以传入对应的
CultureInfo(比如new CultureInfo("es-ES")),而不是默认的InvariantCulture。
内容的提问来源于stack exchange,提问作者user13472845
相关产品推荐
相关产品推荐

