从路径目录中获取子串

时间:2013-03-29 12:43:08

标签: regex string path c#-3.0

我想要Directory路径中的子字符串。 是否有任何查询或正则表达式。 我的道路是这样的:

E:\\Work\\Taxonomies\\012\\20110826\\20110826_final\\full_entry_point_2011-08-26.xsd

我想要的是

20110826_final\\full_entry_point_2011-08-26.xsd

我想从第二个路径开始“\”我可以将它拆分为数组但是我必须将最后两个值组合起来。

string[] path = value.Split('\\');
int length=path.Length;
if(length>1)
{
 string final = string.Concat(path[length-2],"\\", path[length-1]);
}

请指导我。有没有其他方法可以实现它。

3 个答案:

答案 0 :(得分:2)

String pattern = @"(.*\\)(.*\\.*$)";
String input = @"E:\Work\Taxonomies\012\20110826\20110826_final\full_entry_point_2011-08-26.xsd";
String result = Regex.Match(input, pattern).Groups[2].Value;

修改

此正则表达式将字符串分为两组。 首先 - 所有符号和\它可以在第二组之前。 第二个 - 所有剩余的符号都是'text'\'text''endofstring'

答案 1 :(得分:0)

由于我不知道C#,你可能会对“\”的数量达成协议,但是,如果你想用正则表达式做这件事:

/(?<=\\\\)[^\\]+\\\\[^\\]+$/

即“一个或多个字符前面有2个反斜杠,然后是2个反斜杠,然后是一个或多个字符,直到结尾”。当我指的是性格时,我的意思是除了反斜杠之外的一切。

答案 2 :(得分:0)

使用正则表达式进行此搜索操作的另一种方法是在String类上使用LastIndexOf方法:

    static bool TryFindTrailingPart(string path, int numberOfSeparators, out string result)
    {
        var sep = Path.DirectorySeparatorChar;
        var lastSlash = path.Length;
        for(int i = 0; i < numberOfSeparators; i++)
        {
            lastSlash = path.LastIndexOf(sep, lastSlash - 1);
            if(lastSlash < 0)
            {
                result = null;
                return false;
            }
        }

        result = path.Substring(lastSlash + 1);
        return true;
    }

虽然这段代码比正则表达式长得多,但它确实有一些优点:它比正则表达式方法(参数化要搜索的路径分隔符的数量)更灵活,并且执行速度要快得多。

使用OP的路径表达式在紧密循环中运行上述代码需要大约200毫秒进行10000次迭代。

使用Dmitry Dovgopoly给出的相同迭代次数的正则表达式方法大约需要6890毫秒。将Dmitry的代码转换为使用已编译的正则表达式(并排除编译表达式所需的时间)仍然需要大约3140毫秒。

这种方法的速度和灵活性是否超过源代码长度的增加在很大程度上取决于您的具体情况:如果您正在处理(非常!)大量的路径字符串,它可能会有用。另一方面,如果您只需要“一次性”代码来处理路径字符串处理问题,那么正则表达式方法可能更合适。