Как уменьшить эту функцию обнаружения архива и сделать его поддерживает подстановочные знаки


Ниже функция вызывается для определения, является ли данный файл находится в архиве другой файл. Я также ищу способ поддерживает подстановочные знаки. Например, если исходный файл журнал serverw3c.войдите и мы serverw3c типа*.журнал, возвращает true в следующих случаях:

  • serverw3c.журнал.2011-02-04
  • serverw3c.журнал
  • serverw3c.журнал.20110204_120132
  • serverw3c_20110204.журнал

Код:

/// <summary>
/// Check if a given file is an archive of an original file.
/// The check is performed on the names of the files only.
/// </summary>
/// <param name="originalFile">The original file.</param>
/// <param name="archivedFile">The file which is supposed to be an archive of the original one.</param>
/// <returns>True if the file is an archive, False otherwise.</returns>
public bool IsArchive(string originalFile, string archivedFile)
{
    // We assume that an archived file has the name of the original 
    // concatenated with a timestamp '.YYYYMMDD_HHMMSS'
    Regex exp = new Regex(string.Concat(originalFile, ".", "[0-9][0-9][0-9][0-9][0-1][0-9][0-9][0-9]_[0-2][0-9][0-5][0-9][0-5][0-9]"));
    if (exp.IsMatch(archivedFile))
        return true;

    exp = new Regex(string.Concat(Path.GetFileNameWithoutExtension(originalFile), "_", "[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]", Path.GetExtension(".log")));
    if (exp.IsMatch(archivedFile))
        return true;

    exp = new Regex(string.Concat(Path.GetFileNameWithoutExtension(originalFile), "_", "[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]", "_", "[0-9][0-9][0-9]", Path.GetExtension(".log")));
    if (exp.IsMatch(archivedFile))
        return true;

    exp = new Regex(string.Concat(originalFile, ".", "[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]"));
    if (exp.IsMatch(archivedFile))
        return true;

    return false;
}


218
5
задан 4 февраля 2011 в 07:02 Источник Поделиться
Комментарии
2 ответа

Ваше регулярное выражение может быть сокращен, используя {х}, которые повторяют узор х раз. Так что ваш третий регекс стать:

exp = new Regex(string.Concat(Path.GetFileNameWithoutExtension(originalFile),
"_[0-9]{8}_[0-9]{3}",
Path.GetExtension(".log")));

Насколько шаблону, если вы используете * он будет введен в регулярное выражение. Он смотрит из MSDN в том, что оно не будет удалено из имени файла при вызове GetFileNameWithoutExtension(). Однако, я был не в состоянии проверить это, так как я не иметь Visual Studio на моем компьютере. Он работал в качестве подстановочного на мои тесты тестирую.

3
ответ дан 4 февраля 2011 в 07:02 Источник Поделиться

Здесь является подстановочным альтернатива

public bool IsArchive(string filePattern, string archivedFile)
{
return new Regex(filePattern.Replace("*", "[^ ]*")).IsMatch(archivedFile);
}

1
ответ дан 5 февраля 2011 в 10:02 Источник Поделиться