当前位置:  开发笔记 > 编程语言 > 正文

.NET中的glob模式匹配

如何解决《.NET中的glob模式匹配》经验,为你挑选了5个好方法。

.NET中是否有内置机制来匹配正则表达式以外的模式?我想使用UNIX样式(glob)通配符匹配(*=任何数字的任何字符).

我想将它用于面向最终用户的控件.我担心允许所有RegEx功能会非常混乱.



1> mindplay.dk..:

我喜欢我的代码更加语义,所以我编写了这个扩展方法:

using System.Text.RegularExpressions;

namespace Whatever
{
    public static class StringExtensions
    {
        /// 
        /// Compares the string against a given pattern.
        /// 
        /// The string.
        /// The pattern to match, where "*" means any sequence of characters, and "?" means any single character.
        /// true if the string matches the given pattern; otherwise false.
        public static bool Like(this string str, string pattern)
        {
            return new Regex(
                "^" + Regex.Escape(pattern).Replace(@"\*", ".*").Replace(@"\?", ".") + "$",
                RegexOptions.IgnoreCase | RegexOptions.Singleline
            ).IsMatch(str);
        }
    }
}

(更改命名空间和/或将扩展方法复制到您自己的字符串扩展类)

使用此扩展,您可以编写如下语句:

if (File.Name.Like("*.jpg"))
{
   ....
}

只是糖,使你的代码更清晰:-)


我从这篇文章中学到了三件新东西.
优秀的方法.我会将参数重命名为`pattern`以避免混淆它自己设置通配符.

2> Jonathan C D..:

我找到了你的实际代码:

Regex.Escape( wildcardExpression ).Replace( @"\*", ".*" ).Replace( @"\?", "." );


你可能还想在之前添加一个"^",并在结尾处使用"$"来模仿UNIX/DOS通配,对吧?
我想我会用@"[^ \\\.]*"替换"\*" - 暗示除了点或斜线之外的任何字符,它们在文件名格式中都是有意义的.
要正确支持通配符转义和东西,你需要比`string.Replace()`更复杂的东西.这段代码将用户提供的`\*`转换为`\\.*`的正则表达式,它与输入字符串`*`不匹配.

3> cleftheris..:

只是为了完整.自2016年以来,dotnet core有一个名为Microsoft.Extensions.FileSystemGlobbing支持高级全球路径的新nuget包.(Nuget套餐)

一些例子可能是,搜索在Web开发场景中非常常见的通配符嵌套文件夹结构和文件.

wwwroot/app/**/*.module.js

wwwroot/app/**/*.js

这与.gitignore用于确定要从源代码管理中排除哪些文件的文件有些类似.


我将此添加到我的C#控制台应用程序(50行代码)中,NuGet提取了280兆字节的软件包依赖项.所以它可能不适合所有场景(或者如果有人知道如何减少它......)
请注意,自2018年12月起,"Microsoft.Extensions.FileSystemGlobbing"仍然不能与"组合"文件(即远程或卸载文件)一起使用.请参阅https://github.com/aspnet/Extensions/issues/848对于这个特殊情况,我使用了DotNet.Glob nuget软件包(/sf/ask/17360801/),它快速而小巧.

4> Dan Mangiare..:

列表方法的2和3参数变体喜欢GetFiles()并将EnumerateDirectories()搜索字符串作为支持文件名通配的第二个参数,使用*?.

class GlobTestMain
{
    static void Main(string[] args)
    {
        string[] exes = Directory.GetFiles(Environment.CurrentDirectory, "*.exe");
        foreach (string file in exes)
        {
            Console.WriteLine(Path.GetFileName(file));
        }
    }
}

会屈服

GlobTest.exe
GlobTest.vshost.exe

文档声明存在一些具有匹配扩展的警告.它还指出8.3文件名是匹配的(可能在幕后自动生成),这可能导致给定某些模式的"重复"匹配.

支持此方法是GetFiles(),GetDirectories()GetFileSystemEntries().该Enumerate变种也支持这一点.



5> torial..:

如果使用VB.Net,则可以使用Like语句,它具有类似Glob的语法.

http://www.getdotnetcode.com/gdncstore/free/Articles/Intoduction%20to%20the%20VB%20NET%20Like%20Operator.htm

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有