сопоставление с образцом шарика в.NET

Существует ли встроенный механизм в.NET для соответствия шаблонам кроме Регулярных выражений? Я хотел бы соответствовать стилю UNIX использования (шарик) подстановочные знаки (* = любое количество любого символа).

Я хотел бы использовать это для конечного пользователя, сталкивающегося с управлением. Я боюсь, что разрешение всех возможностей RegEx будет очень сбивать с толку.

46
задан dmo 9 October 2008 в 20:11
поделиться

2 ответа

Основываясь на предыдущих сообщениях, я собрал класс C #:

using System;
using System.Text.RegularExpressions;

public class FileWildcard
{
    Regex mRegex;

    public FileWildcard(string wildcard)
    {
        string pattern = string.Format("^{0}$", Regex.Escape(wildcard)
            .Replace(@"\*", ".*").Replace(@"\?", "."));
        mRegex = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Singleline);
    }
    public bool IsMatch(string filenameToCompare)
    {
        return mRegex.IsMatch(filenameToCompare);
    }
}

Его использование будет выглядеть примерно так:

FileWildcard w = new FileWildcard("*.txt");
if (w.IsMatch("Doug.Txt"))
   Console.WriteLine("We have a match");

Соответствие НЕ совпадает с методом System.IO.Directory.GetFiles (), поэтому не используйте их вместе.

1
ответ дан 26 November 2019 в 20:04
поделиться

Варианты с 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 также поддерживают это.

10
ответ дан 26 November 2019 в 20:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: