Fork me on GitHub

在.NET Core,除了VB的LikeString,还有其它方法吗?(四种LikeString实现分享)

Like运算符很好用,特别是它所提供的其中*、?这两种通配符,在Windows文件系统和各类项目中运用非常广泛。

但Like运算符仅在VB中支持,在C#中,如何实现呢?

以下是关于LikeString的四种实现方式,其中第四种为Regex正则表达式实现,且在.NET Standard 2.0及以上平台支持。

  1. Operators.LikeString 方法

    方法描述:表示 Visual Basic 的 Like 运算符,对给定的两个字符串执行二进制字符串或文本字符串比较。
    平台兼容性:该方法由Microsoft.VisualBasic.dll库提供,仅在.NET Framework平台下支持。
    参考链接:https://learn.microsoft.com/en-us/dotnet/api/microsoft.visualbasic.compilerservices.operators.likestring
    源码链接:

  2. 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.vb

  3. FileSystemName.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.cs

  4. RegexLikeOperator.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);
    }
}
posted @ 2024-06-11 23:49  VAllen  阅读(601)  评论(4编辑  收藏  举报