0

我想要目录路径中的子字符串。是否有任何查询或正则表达式可以做到这一点。我的路径是这样的:

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]);
}

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

4

3 回答 3

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'

于 2013-03-29T12:50:56.000 回答
0

因为我不知道 C#,你可能会处理“\”的数量,但是,如果你想用正则表达式来做:

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

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

于 2013-03-29T12:50:36.810 回答
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 毫秒。

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

于 2013-03-29T14:26:49.570 回答