使用完全限定的文件名问题进行​​存储分类 - 实际上是一个解析问题

时间:2011-04-08 21:01:15

标签: c# text-parsing

我可以做到这一点,但我的解决方案看起来有点像黑客,所以我想请求SO以获得更优雅的解决方案。我需要获取一个完全限定的文件名列表,并根据路径名中的子字符串将它们分类/复制到几个桶中。

我有三个桶,可能更多,可以改变。假设我有三个这些文件被复制到的桶,比如“foo”,“foo \ bar”和“foo \ baz”。所以文件C:\ mumble \ foo \ bar \ thing.extension进入foo \ bar存储桶,C:\ fumble \ foo \ baz \ this \是\另一个\目录\ bling.extension进入\ foo \ baz bucket和D:\ stumble \ foo \ something.extension进入foo bucket。我需要重定向文件,所以我一直在使用IndexOf(所以我可以创建副本的方向),但这并没有真正起作用,因为\ foo和foo \ bar是相似的,需要不同的存储桶。然后我想我可以使用file.Contains,但是\ foo和\ foo \ baz进入不同的桶,所以需要一个优先级,foo \ bar到一个但是\ foo到另一个。

任何想法如何以相对简单的方式做到这一点?我的代码令人尴尬。

感谢Doug

1 个答案:

答案 0 :(得分:0)

尝试类似的东西。

    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语句的最后一个条件。