#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. Поскольку эта сортировка может быть изменена в любое время, я решил использовать регулярное выражение, как вы предлагаете, но вставить условия в конфигурационный файл, а не в жесткий код. Спасибо, я подумал о регулярном выражении, но не рассматривал возможность чтения его из файла.