在.NET Core,除了VB的LikeString,还有其它方法吗?(四种LikeString实现分享)
Like运算符很好用,特别是它所提供的其中*、?这两种通配符,在Windows文件系统和各类项目中运用非常广泛。
但Like运算符仅在VB中支持,在C#中,如何实现呢?
以下是关于LikeString的四种实现方式,其中第四种为Regex正则表达式实现,且在.NET Standard 2.0及以上平台支持。
Operators.LikeString 方法
方法描述:表示 Visual Basic 的 Like 运算符,对给定的两个字符串执行二进制字符串或文本字符串比较。
平台兼容性:该方法由Microsoft.VisualBasic.dll库提供,仅在.NET Framework平台下支持。
参考链接:https://learn.microsoft.com/en-us/dotnet/api/microsoft.visualbasic.compilerservices.operators.likestring
源码链接:无LikeOperator.LikeString 方法
方法描述:对给定的两个字符串执行二进制字符串或文本字符串比较。
平台兼容性:该方法由Microsoft.VisualBasic.Core.dll提供,在.NET Framework和.NET Core 3.0+以上平台都支持。
参考链接:https://learn.microsoft.com/en-us/dotnet/api/microsoft.visualbasic.compilerservices.likeoperator.likestring
源码链接:https://github.com/dotnet/runtime/blob/main/src/libraries/Microsoft.VisualBasic.Core/src/Microsoft/VisualBasic/CompilerServices/LikeOperator.vbFileSystemName.MatchesSimpleExpression 方法
方法描述:验证给定表达式是否与给定名称匹配。支持以下通配符:“*”and“?”。反斜杠字符“\”将转义。
平台兼容性:该方法由System.Private.CoreLib.dll提供,在.NET Standard 2.1和.NET Core 2.1+以上平台都支持。
参考链接:https://learn.microsoft.com/en-us/dotnet/api/system.io.enumeration.filesystemname.matchessimpleexpression
源码链接:https://github.com/dotnet/runtime/blob/main/src/libraries/System.Private.CoreLib/src/System/IO/Enumeration/FileSystemName.csRegexLikeOperator.LikeString 方法
方法描述:使用正则表达式,模仿LikeOperator.LikeString方法,实现字符串的通配符匹配,持*和?通配符,支持忽略大小写匹配。
平台兼容性:该方法由GitHub Copilot实现,在.NET Standard 1.0和.NET Framework 1.1+以上以及.NET Core 1.0+以上平台都支持。
源码实现:
/// <summary>
/// 使用正则表达式,模仿Microsoft.VisualBasic.CompilerServices.LikeOperator.LikeString方法,实现字符串的通配符匹配
/// </summary>
public static class RegexLikeOperator
{
/// <summary>
/// 使用正则表达式,模仿Microsoft.VisualBasic.CompilerServices.LikeOperator.LikeString方法,实现字符串的通配符匹配。<br/>
/// 支持*和?通配符,支持忽略大小写匹配。
/// </summary>
/// <param name="content">文本内容</param>
/// <param name="pattern">通配符</param>
/// <param name="ignoreCase">是否忽略大小写匹配</param>
/// <returns></returns>
/// <remarks>
/// 经过Benchmark性能测试,本方法相比Microsoft.VisualBasic.CompilerServices.LikeOperator.LikeString方法,<br/>
/// 在执行性能上,表现较差,<br/>
/// 在内存分配上,表现优秀。
/// 忽略大小写匹配后,执行性能比不忽略大小写匹配的要好。
/// </remarks>
public static bool LikeString(string? content, string? pattern, bool ignoreCase = true)
{
if (content == null && pattern == null)
return true;
if (content == null || pattern == null)
return false;
string regexPattern = "^" + Regex.Escape(pattern).Replace("\\*", ".*").Replace("\\?", ".") + "$";
RegexOptions options = ignoreCase ? RegexOptions.IgnoreCase : RegexOptions.None;
return Regex.IsMatch(content, regexPattern, options);
}
}
Like 运算符介绍:https://learn.microsoft.com/en-us/dotnet/visual-basic/language-reference/operators/like-operator
附上Benchmark性能测试代码:
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Jobs;
using Microsoft.VisualBasic;
using Microsoft.VisualBasic.CompilerServices;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.IO.Enumeration;
namespace PerformanceTest.BenchmarkDotNet;
[SimpleJob(RuntimeMoniker.Net80)]
[MemoryDiagnoser, MemoryRandomization]
public class LikeStringTest
{
public static IEnumerable<object[]> GetParams() =>
new List<object[]>
{
new object[] { "*股份*低于委托数量*", true, "平安银行000001.SZ股份500低于委托数量1000。" },
new object[] { "*股份*低于委托数量*", false, "平安银行000001.SZ股份500低于委托数量1000。" },
new object[] { "*股份*低于委托数量*", true, "超过500个字符的中型文本,平安银行000001.SZ股份500低于委托数量1000。平安银行股份有限公司主要从事经有关监管机构批准的各项商业银行业务。2020年3月,《亚洲货币》主办2020“中国私人银行大奖”评选,本行私人银行获评“最佳家族办公室”大奖;2020年8月,《亚洲银行家》举办“2020年度中国奖项计划”活动,本行荣获“中国最佳手机银行应用”、“中国最佳客户体验(无摩擦奖项类别)”、“中国最佳商业模式”、“中国最佳贸易金融银行奖”、“最佳网络安全和IT风险管理项目”等八项大奖;2020年11月,权威机构IT研究顾问公司Gartner主办的“Gartner金融服务创新奖”决赛,本行凭借智慧风控平台项目,获得“Gartner金融服务创新奖”亚太地区的冠军等。" },
new object[] { "*股份*低于委托数量*", false, "超过500个字符的中型文本,平安银行000001.SZ股份500低于委托数量1000。平安银行股份有限公司主要从事经有关监管机构批准的各项商业银行业务。2020年3月,《亚洲货币》主办2020“中国私人银行大奖”评选,本行私人银行获评“最佳家族办公室”大奖;2020年8月,《亚洲银行家》举办“2020年度中国奖项计划”活动,本行荣获“中国最佳手机银行应用”、“中国最佳客户体验(无摩擦奖项类别)”、“中国最佳商业模式”、“中国最佳贸易金融银行奖”、“最佳网络安全和IT风险管理项目”等八项大奖;2020年11月,权威机构IT研究顾问公司Gartner主办的“Gartner金融服务创新奖”决赛,本行凭借智慧风控平台项目,获得“Gartner金融服务创新奖”亚太地区的冠军等。" },
new object[] { "*股份*低于委托数量*", true, "超过5000个字符的大型文本,平安银行000001.SZ股份500低于委托数量1000。平安银行股份有限公司主要从事经有关监管机构批准的各项商业银行业务。2020年3月,《亚洲货币》主办2020“中国私人银行大奖”评选,本行私人银行获评“最佳家族办公室”大奖;2020年8月,《亚洲银行家》举办“2020年度中国奖项计划”活动,本行荣获“中国最佳手机银行应用”、“中国最佳客户体验(无摩擦奖项类别)”、“中国最佳商业模式”、“中国最佳贸易金融银行奖”、“最佳网络安全和IT风险管理项目”等八项大奖;2020年11月,权威机构IT研究顾问公司Gartner主办的“Gartner金融服务创新奖”决赛,本行凭借智慧风控平台项目,获得“Gartner金融服务创新奖”亚太地区的冠军等。\r\n为深入贯彻中央金融工作会议精神和《国务院关于加强监管防范风险推动资本市场高质量发展的若干意见》,进一步完善市场基础制度,引导创业板上市公司股东依法依规有序转让股份,深圳证券交易所和中国证券登记结算有限责任公司共同制定了《深圳证券交易所 中国证券登记结算有限责任公司创业板上市公司股东询价和配售方式转让股份业务指引》,现予以发布,自发布之日起施行。\r\n平安银行股份有限公司主要从事经有关监管机构批准的各项商业银行业务。2020年3月,《亚洲货币》主办2020“中国私人银行大奖”评选,本行私人银行获评“最佳家族办公室”大奖;2020年8月,《亚洲银行家》举办“2020年度中国奖项计划”活动,本行荣获“中国最佳手机银行应用”、“中国最佳客户体验(无摩擦奖项类别)”、“中国最佳商业模式”、“中国最佳贸易金融银行奖”、“最佳网络安全和IT风险管理项目”等八项大奖;2020年11月,权威机构IT研究顾问公司Gartner主办的“Gartner金融服务创新奖”决赛,本行凭借智慧风控平台项目,获得“Gartner金融服务创新奖”亚太地区的冠军等。\r\n为深入贯彻中央金融工作会议精神和《国务院关于加强监管防范风险推动资本市场高质量发展的若干意见》,进一步完善市场基础制度,引导创业板上市公司股东依法依规有序转让股份,深圳证券交易所和中国证券登记结算有限责任公司共同制定了《深圳证券交易所 中国证券登记结算有限责任公司创业板上市公司股东询价和配售方式转让股份业务指引》,现予以发布,自发布之日起施行。平安银行股份有限公司主要从事经有关监管机构批准的各项商业银行业务。2020年3月,《亚洲货币》主办2020“中国私人银行大奖”评选,本行私人银行获评“最佳家族办公室”大奖;2020年8月,《亚洲银行家》举办“2020年度中国奖项计划”活动,本行荣获“中国最佳手机银行应用”、“中国最佳客户体验(无摩擦奖项类别)”、“中国最佳商业模式”、“中国最佳贸易金融银行奖”、“最佳网络安全和IT风险管理项目”等八项大奖;2020年11月,权威机构IT研究顾问公司Gartner主办的“Gartner金融服务创新奖”决赛,本行凭借智慧风控平台项目,获得“Gartner金融服务创新奖”亚太地区的冠军等。\r\n为深入贯彻中央金融工作会议精神和《国务院关于加强监管防范风险推动资本市场高质量发展的若干意见》,进一步完善市场基础制度,引导创业板上市公司股东依法依规有序转让股份,深圳证券交易所和中国证券登记结算有限责任公司共同制定了《深圳证券交易所 中国证券登记结算有限责任公司创业板上市公司股东询价和配售方式转让股份业务指引》,现予以发布,自发布之日起施行。平安银行股份有限公司主要从事经有关监管机构批准的各项商业银行业务。2020年3月,《亚洲货币》主办2020“中国私人银行大奖”评选,本行私人银行获评“最佳家族办公室”大奖;2020年8月,《亚洲银行家》举办“2020年度中国奖项计划”活动,本行荣获“中国最佳手机银行应用”、“中国最佳客户体验(无摩擦奖项类别)”、“中国最佳商业模式”、“中国最佳贸易金融银行奖”、“最佳网络安全和IT风险管理项目”等八项大奖;2020年11月,权威机构IT研究顾问公司Gartner主办的“Gartner金融服务创新奖”决赛,本行凭借智慧风控平台项目,获得“Gartner金融服务创新奖”亚太地区的冠军等。\r\n为深入贯彻中央金融工作会议精神和《国务院关于加强监管防范风险推动资本市场高质量发展的若干意见》,进一步完善市场基础制度,引导创业板上市公司股东依法依规有序转让股份,深圳证券交易所和中国证券登记结算有限责任公司共同制定了《深圳证券交易所 中国证券登记结算有限责任公司创业板上市公司股东询价和配售方式转让股份业务指引》,现予以发布,自发布之日起施行。" },
new object[] { "*股份*低于委托数量*", false, "超过5000个字符的大型文本,平安银行000001.SZ股份500低于委托数量1000。平安银行股份有限公司主要从事经有关监管机构批准的各项商业银行业务。2020年3月,《亚洲货币》主办2020“中国私人银行大奖”评选,本行私人银行获评“最佳家族办公室”大奖;2020年8月,《亚洲银行家》举办“2020年度中国奖项计划”活动,本行荣获“中国最佳手机银行应用”、“中国最佳客户体验(无摩擦奖项类别)”、“中国最佳商业模式”、“中国最佳贸易金融银行奖”、“最佳网络安全和IT风险管理项目”等八项大奖;2020年11月,权威机构IT研究顾问公司Gartner主办的“Gartner金融服务创新奖”决赛,本行凭借智慧风控平台项目,获得“Gartner金融服务创新奖”亚太地区的冠军等。\r\n为深入贯彻中央金融工作会议精神和《国务院关于加强监管防范风险推动资本市场高质量发展的若干意见》,进一步完善市场基础制度,引导创业板上市公司股东依法依规有序转让股份,深圳证券交易所和中国证券登记结算有限责任公司共同制定了《深圳证券交易所 中国证券登记结算有限责任公司创业板上市公司股东询价和配售方式转让股份业务指引》,现予以发布,自发布之日起施行。\r\n平安银行股份有限公司主要从事经有关监管机构批准的各项商业银行业务。2020年3月,《亚洲货币》主办2020“中国私人银行大奖”评选,本行私人银行获评“最佳家族办公室”大奖;2020年8月,《亚洲银行家》举办“2020年度中国奖项计划”活动,本行荣获“中国最佳手机银行应用”、“中国最佳客户体验(无摩擦奖项类别)”、“中国最佳商业模式”、“中国最佳贸易金融银行奖”、“最佳网络安全和IT风险管理项目”等八项大奖;2020年11月,权威机构IT研究顾问公司Gartner主办的“Gartner金融服务创新奖”决赛,本行凭借智慧风控平台项目,获得“Gartner金融服务创新奖”亚太地区的冠军等。\r\n为深入贯彻中央金融工作会议精神和《国务院关于加强监管防范风险推动资本市场高质量发展的若干意见》,进一步完善市场基础制度,引导创业板上市公司股东依法依规有序转让股份,深圳证券交易所和中国证券登记结算有限责任公司共同制定了《深圳证券交易所 中国证券登记结算有限责任公司创业板上市公司股东询价和配售方式转让股份业务指引》,现予以发布,自发布之日起施行。平安银行股份有限公司主要从事经有关监管机构批准的各项商业银行业务。2020年3月,《亚洲货币》主办2020“中国私人银行大奖”评选,本行私人银行获评“最佳家族办公室”大奖;2020年8月,《亚洲银行家》举办“2020年度中国奖项计划”活动,本行荣获“中国最佳手机银行应用”、“中国最佳客户体验(无摩擦奖项类别)”、“中国最佳商业模式”、“中国最佳贸易金融银行奖”、“最佳网络安全和IT风险管理项目”等八项大奖;2020年11月,权威机构IT研究顾问公司Gartner主办的“Gartner金融服务创新奖”决赛,本行凭借智慧风控平台项目,获得“Gartner金融服务创新奖”亚太地区的冠军等。\r\n为深入贯彻中央金融工作会议精神和《国务院关于加强监管防范风险推动资本市场高质量发展的若干意见》,进一步完善市场基础制度,引导创业板上市公司股东依法依规有序转让股份,深圳证券交易所和中国证券登记结算有限责任公司共同制定了《深圳证券交易所 中国证券登记结算有限责任公司创业板上市公司股东询价和配售方式转让股份业务指引》,现予以发布,自发布之日起施行。平安银行股份有限公司主要从事经有关监管机构批准的各项商业银行业务。2020年3月,《亚洲货币》主办2020“中国私人银行大奖”评选,本行私人银行获评“最佳家族办公室”大奖;2020年8月,《亚洲银行家》举办“2020年度中国奖项计划”活动,本行荣获“中国最佳手机银行应用”、“中国最佳客户体验(无摩擦奖项类别)”、“中国最佳商业模式”、“中国最佳贸易金融银行奖”、“最佳网络安全和IT风险管理项目”等八项大奖;2020年11月,权威机构IT研究顾问公司Gartner主办的“Gartner金融服务创新奖”决赛,本行凭借智慧风控平台项目,获得“Gartner金融服务创新奖”亚太地区的冠军等。\r\n为深入贯彻中央金融工作会议精神和《国务院关于加强监管防范风险推动资本市场高质量发展的若干意见》,进一步完善市场基础制度,引导创业板上市公司股东依法依规有序转让股份,深圳证券交易所和中国证券登记结算有限责任公司共同制定了《深圳证券交易所 中国证券登记结算有限责任公司创业板上市公司股东询价和配售方式转让股份业务指引》,现予以发布,自发布之日起施行。" }
};
[Benchmark]
[ArgumentsSource(nameof(GetParams))]
public bool Regex_LikeString(string pattern, bool ignoreCase, string content)
{
return RegexLikeOperator.LikeString(content, pattern, ignoreCase);
}
[Benchmark]
[ArgumentsSource(nameof(GetParams))]
public bool LikeOperator_LikeString(string pattern, bool ignoreCase, string content)
{
CompareMethod compareMethod = ignoreCase ? CompareMethod.Text : CompareMethod.Binary;
return LikeOperator.LikeString(content, pattern, compareMethod);
}
[Benchmark]
[ArgumentsSource(nameof(GetParams))]
public bool FileSystemName_MatchesSimpleExpression(string pattern, bool ignoreCase, string content)
{
return FileSystemName.MatchesSimpleExpression(pattern, content, ignoreCase);
}
}
/// <summary>
/// 使用正则表达式,模仿Microsoft.VisualBasic.CompilerServices.LikeOperator.LikeString方法,实现字符串的通配符匹配
/// </summary>
public static class RegexLikeOperator
{
/// <summary>
/// 使用正则表达式,模仿Microsoft.VisualBasic.CompilerServices.LikeOperator.LikeString方法,实现字符串的通配符匹配。<br/>
/// 支持*和?通配符,支持忽略大小写匹配。
/// </summary>
/// <param name="content">文本内容</param>
/// <param name="pattern">通配符</param>
/// <param name="ignoreCase">是否忽略大小写匹配</param>
/// <returns></returns>
/// <remarks>
/// 经过Benchmark性能测试,本方法相比Microsoft.VisualBasic.CompilerServices.LikeOperator.LikeString方法,<br/>
/// 在执行性能上,表现较差,<br/>
/// 在内存分配上,表现优秀。
/// 忽略大小写匹配后,执行性能比不忽略大小写匹配的要好。
/// </remarks>
public static bool LikeString(string? content, string? pattern, bool ignoreCase = true)
{
if (content == null && pattern == null)
return true;
if (content == null || pattern == null)
return false;
string regexPattern = "^" + Regex.Escape(pattern).Replace("\\*", ".*").Replace("\\?", ".") + "$";
RegexOptions options = ignoreCase ? RegexOptions.IgnoreCase : RegexOptions.None;
return Regex.IsMatch(content, regexPattern, options);
}
}
在.NET Core,除了VB的LikeString,还有其它方法吗?(四种LikeString实现分享)的更多相关文章
- Pascal、VB、C#、Java四种语法对照表
因为工作原因,自学会了vb后陆续接触了其它语言,在工作中经常需要与各家使用不同语言公司的开发人员做程序对接,初期特别需要一个各种语法的对照比,翻看了网络上已有高人做了整理,自己在他基础上也整理了一下, ...
- VB.NET中网络编程的另一种方案----system.net中的HttpWebRequest类的使用
VB.NET中网络编程的另一种方案---- system.net中的HttpWebRequest类的使用 在VB.net中进行网络编程,除了我之前写的随笔中的使用WinHttp组件进行编程,还有另一种 ...
- 你想要的都在这里,ASP.NET Core MVC四种枚举绑定方式
前言 本节我们来讲讲在ASP.NET Core MVC又为我们提供了哪些方便,之前我们探讨过在ASP.NET MVC中下拉框绑定方式,这节我们来再来重点看看枚举绑定的方式,充分实现你所能想到的场景,满 ...
- ASP.NET Core 四种释放 IDisposable 对象的方法
本文翻译自<Four ways to dispose IDisposables in ASP.NET Core>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! IDispos ...
- spring cloud+dotnet core搭建微服务架构:配置中心(四)
前言 我们项目中有很多需要配置的地方,最常见的就是各种服务URL地址,这些地址针对不同的运行环境还不一样,不管和打包还是部署都麻烦,需要非常的小心.一般配置都是存储到配置文件里面,不管多小的配置变动, ...
- 解决VS2019中.net core WPF 暂时无法使用 Designer 的临时方法
目录 解决 VS2019 中.net core WPF 暂时无法使用 Designer 的临时方法 安装 vs 2019 professional/enterprise版本 在vs的设置里,勾选.NE ...
- Core文件简单介绍及生成设置方法
Core文件简单介绍及生成设置方法 Core文件其实就是内存的映像,当程序崩溃时,存储内存的相应信息,主用用于对程序进行调试.当程序崩溃时便会产生core文件,其实准确的应该说是core dump 文 ...
- ASP.NET Core 四种方式绑定枚举值
前言 本节我们来讲讲在ASP.NET Core MVC又为我们提供了哪些方便,之前我们探讨过在ASP.NET MVC中下拉框绑定方式,这节我们来再来重点看看枚举绑定的方式,充分实现你所能想到的场景,满 ...
- .net core 2.x - 缓存的四种方式
其实这些微软docs都有现成的,但是现在的人想对浮躁些,去看的不会太多,所以这里就再记录下 ,大家一起懒一起浮躁,呵呵. 0.基础知识 通过减少生成内容所需的工作,缓存可以显著提高应用的性能和可伸缩性 ...
- ASP.NET Core MVC四种枚举绑定方式
前言 本节我们来讲讲在ASP.NET Core MVC又为我们提供了哪些方便,之前我们探讨过在ASP.NET MVC中下拉框绑定方式,这节我们来再来重点看看枚举绑定的方式,充分实现你所能想到的场景,满 ...
随机推荐
- [GPT] swoole的协程和golang的协程有什么区别,哪个更好
Swoole 的协程和 Golang(Go 语言)的协程(Goroutine)在概念上都是为了实现轻量级的并发编程,但它们在具体实现.使用方式和性能特点上有所不同: 实现原理: Golang 协程(G ...
- 2018-2-13-win10-uwp-右击选择-GridViewItem-
title author date CreateTime categories win10 uwp 右击选择 GridViewItem lindexi 2018-2-13 17:23:3 +0800 ...
- Git基础使用指南-命令详解
Software is like sex: it's better when it's free. -- Linus Torvalds 前情须知 -O- 工作流程 首先要明确的是Git的工作流程,你使 ...
- 开发日志:Kylin麒麟操作系统部署ASP.NET CORE
需求场景: 我需要部署的项目是在Windows上开发的,目标框架为.net core 6.0 因此我们需要先在kylin上部署项目运行所需要的环境. 借助百度词条,先看看Kylin是什么: 服务器资源 ...
- MySQL—MySQL的存储引擎之InnoDB
MySQL-MySQL的存储引擎之InnoDB 存储引擎及种类 存储引擎 说明 MyISAM 高速引擎,拥有较高的插入,查询速度,但不支持事务 InnoDB 5.5版本后MySQL的默认数据库存储引擎 ...
- 鸿蒙HarmonyOS实战-ArkUI事件(焦点事件)
前言 焦点事件是指程序中的重要事件或关键点.焦点事件通常是程序的核心逻辑和功能,需要引起特殊的关注和处理. 在图形用户界面(GUI)编程中,焦点事件通常与用户交互和界面输入相关.例如,当用户点击按钮. ...
- ruby操作excel
操作xlsx axlsx插件 操作xls spreadsheet插件
- thinkphp5 关于跨域的一些坑,附上解决办法(比较全面了)
项目背景:前端是uniapp开发的h5,后端是tp5,其他语言我觉得应该大同小异,主要是思路,本文就以这俩为例吧 1.首先在tp5的入口文件:public/index.php 在里面添加三行: // ...
- leaflet利用hotline实现河流差值渲染热力图
实现效果(这里做了1条主河道和5个支流): 核心代码使用了Leaflet.hotline插件,github下载地址链接 详情见我之前整理的一篇文章介绍河流热力图 核心代码逻辑: // 处理河流数据以及 ...
- MQ消息积压,把我整吐血了
前言 我之前在一家餐饮公司待过两年,每天中午和晚上用餐高峰期,系统的并发量不容小觑. 为了保险起见,公司规定各部门都要在吃饭的时间轮流值班,防止出现线上问题时能够及时处理. 我当时在后厨显示系统团队, ...