在.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中下拉框绑定方式,这节我们来再来重点看看枚举绑定的方式,充分实现你所能想到的场景,满 ...
随机推荐
- PolarDB开源未来将有哪些新动向?阿里云数据库开源负责人来解答
简介: 在10月25日由阿里云开发者社区.PolarDB开源社区.infoQ联合举办的「开源人说」第三期--<数据库PolarDB专场>沙龙上,阿里云数据库开源负责人.数据库资深技术专家王 ...
- [K8s] Pod 与容器设计模式 Sidecar
为什么 Pod 必须是原子调度? 在两个容器紧密协作的场景中,避免调度失败问题. Pod 解决了里面多个容器之间高效共享某些资源和数据,共享网络.共享存储. 容器设计模式? 通过在 Pod 里定义专门 ...
- 2019-9-27-微软的-P2P-下载方式
title author date CreateTime categories 微软的 P2P 下载方式 lindexi 2019-09-27 09:44:44 +0800 2019-09-27 09 ...
- C语言程序设计-笔记3-循环结构
C语言程序设计-笔记3-循环结构 例4-1 用格雷戈里公式求给定精度的π值.使用格雷戈里公式求π的近似值,要求精确到最后一项的绝对值小于给定精度eps. =1--+-+- #include<s ...
- js的几个截取
jsfun(){ let str = '01234567' let str1 str1 = str.slice(2,5) ...
- MacBook M1 虚拟机安装Windows for ARM使用体验
前言 大家好,我是 刚进入春天还没来得及踏青又开始从早忙到晚的 蛮三刀.去年给大家带来了一篇比较详尽的MacBook M1评测.评测经历了全网的热情转载,成为了我唯一的一篇爆款文章(我该哭还是该笑!) ...
- Docker 笔记汇总
一.名词说明 Dockerfile 镜像构建文件 Docker Images 镜像:生成容器 Docker Containers 容器:微型系统 Docker Volumes 卷:存放容器运行数据 D ...
- 提交项目到git远程仓库
提交项目到github远程仓库 点击VCS-->Share project on Github 相关信息配置:修改完,点击share 点击add等待完成. 打开浏览器查看,可以发现我们的仓库里出 ...
- [BZOJ4358]permu线段树+莫队
先放代码 晚上补(争取) [BZOJ4358]permu 线段树+莫队做法 序列操作,多次询问,无修,标准的莫队. 在如何在不同区间内转移的问题上,我选择用线段树来维护(没听xfg讲回滚莫队不行啊) ...
- 4G EPS 的接口类型
目录 文章目录 目录 前文列表 接口类型概览 UE 和 eNB 之间的 Uu 接口 eNB 和 EPC 之间的 S1 接口 eNB 和 MME 之间的 S1-C 接口 承载管理 上下文管理 切换资源分 ...