Существует ли встроенный механизм в.NET для соответствия шаблонам кроме Регулярных выражений? Я хотел бы соответствовать стилю UNIX использования (шарик) подстановочные знаки (* = любое количество любого символа).
Я хотел бы использовать это для конечного пользователя, сталкивающегося с управлением. Я боюсь, что разрешение всех возможностей RegEx будет очень сбивать с толку.
Основываясь на предыдущих сообщениях, я собрал класс 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 (), поэтому не используйте их вместе.
Варианты с 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
также поддерживают это.