VB.NET中如何实现不区分大小写的字符串替换
.NET 自定义匹配规则的字符串替换方法
你对原生String.Replace的判断是对的,它默认采用二进制序号比较规则,区分大小写,没有直接开放比较规则的入参。要实现忽略大小写、固定区域性匹配这类自定义规则的替换,有这几种官方支持的实现方式:
- 直接用VB.NET内置的
Replace兼容函数
写VB.NET代码完全可以直接沿用类似VB6的写法,Microsoft.VisualBasic程序集里的内置Replace函数原生支持指定比较规则,迁移零成本:
这个函数是官方正式支持的API,不是遗留兼容的过时方法,可以放心用。' 忽略大小写文本比较写法 s = Replace(s, "Find", "Replace", Compare:=CompareMethod.Text) - 用正则
Regex.Replace实现(C#/VB.NET通用)
如果不想依赖VB专属库,跨语言可以用正则替换,通过正则选项指定匹配规则:s = Regex.Replace( input:=s, pattern:=Regex.Escape("Find"), ' 转义查找串里的正则特殊字符,按普通文本匹配 replacement:="Replace", options:=RegexOptions.IgnoreCase Or RegexOptions.CultureInvariant ) - 自定义扩展方法封装
追求更高性能、不想引入正则开销的话,可以基于String.IndexOf的比较规则入参自己封装替换逻辑,核心是通过StringComparison枚举控制匹配行为:
常用的<Extension> Public Function CustomReplace(input As String, find As String, replace As String, comparison As StringComparison) As String If String.IsNullOrEmpty(input) Or String.IsNullOrEmpty(find) Then Return input Dim startIndex = 0 Dim hitPos = input.IndexOf(find, startIndex, comparison) If hitPos < 0 Then Return input Dim sb As New StringBuilder() While hitPos >= 0 sb.Append(input, startIndex, hitPos - startIndex) sb.Append(replace) startIndex = hitPos + find.Length hitPos = input.IndexOf(find, startIndex, comparison) End While sb.Append(input, startIndex, input.Length - startIndex) Return sb.ToString() End Function ' 调用示例:固定区域性、忽略大小写匹配替换 s = s.CustomReplace("Find", "Replace", StringComparison.InvariantCultureIgnoreCase)StringComparison枚举值对应不同匹配规则:Ordinal:默认二进制比较,区分大小写,性能最高OrdinalIgnoreCase:二进制比较,忽略大小写InvariantCulture:固定区域性比较,区分大小写InvariantCultureIgnoreCase:固定区域性比较,忽略大小写CurrentCulture/CurrentCultureIgnoreCase:使用当前线程区域设置比较
你提到的超长枚举名是调侃.NET早期枚举命名冗长的梗,真实不存在这个值,控制字符串比较规则只需要用上面列的
StringComparison枚举即可。

内容的提问来源于stack exchange,提问作者tmighty
相关产品推荐
相关产品推荐

