Сортировка корзины с использованием полного имени файла вопрос — действительно вопрос синтаксического анализа

#c# #text-parsing

#c# #синтаксический анализ текста

Вопрос:

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

У меня есть три корзины, может быть, больше, и я могу изменить. Допустим, у меня есть три корзины, в которые копируются эти файлы, например «foo», «foo bar» и «foo baz». Итак, файл C:mumblefoobarthing.extension переходит в корзину foo bar и C:fumblefoobazthisisanotherdirectorybling.extension переходит в корзину foobaz и D:stumblefoosomething.extension отправляется в корзину foo. Мне нужно перенаправить файлы, поэтому я использую indexOf (чтобы я мог создать направление копирования), но на самом деле это работает не очень хорошо, потому что foo и foo bar похожи и им нужны разные корзины. Тогда я подумал, что могу использовать file .Содержит, но foo и foobaz находятся в разных корзинах, поэтому нужен приоритет, foo bar для одного, но foo для другого.

Есть идеи, как сделать это с относительной простотой? Мой код смущает.

Спасибо, Дуг

Комментарии:

1. Разве регулярные выражения не помогли бы в вашем случае? Вы можете использовать жадные кванторы для получения соответствия

Ответ №1:

Попробуйте что-то подобное этому.

     private static readonly Regex _foo = new Regex(@"\foo\(?! (bar|baz)\)",
        RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);

    private static readonly Regex _foobar = new Regex(@"\foo\bar\",
        RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);

    private static readonly Regex _foobaz = new Regex(@"\foo\baz\",
        RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);
  

         foreach (var filename in files)
        {
            if (_foo.IsMatch(filename))
            {
                // bucket foo
            }
            else if (_foobar.IsMatch(filename))
            {
                // bucket foobar
            }
            else if (_foobaz.IsMatch(filename))
            {
                // bucket foobaz
            }
        }
  

В качестве альтернативы, удалите отрицательный прогноз в _foo и просто сделайте его последним условием оператора if .

Комментарии:

1. Поскольку эта сортировка может быть изменена в любое время, я решил использовать регулярное выражение, как вы предлагаете, но вставить условия в конфигурационный файл, а не в жесткий код. Спасибо, я подумал о регулярном выражении, но не рассматривал возможность чтения его из файла.