从路径字符串中删除尾随字符

时间:2009-12-08 20:49:44

标签: c# regex

我是regex的新手,我希望在字符串末尾修剪已知数量的字符。该字符串代表一个文件路径,因此我想删除留下c:\test\test1\test2的尾随字符而不是c:\test

我遇到的麻烦就是反斜杠。

我会用什么样的正则表达呢?

5 个答案:

答案 0 :(得分:16)

  

有些人在遇到问题时会想“我知道,我会使用正则表达式。”   现在他们有两个问题。

由于您正在处理文件路径,因此可以使用Path类的方法来计算结果:

string GetPathFirstLevel(string path)
{
    while (Path.GetDirectoryName(path) != Path.GetPathRoot(path))
    {
        path = Path.GetDirectoryName(path);
    }

    return path;
}

这将返回以下值:

GetPathFirstLevel(@"c:\test\test1\test2")  //  @"c:\test"
GetPathFirstLevel(@"c:\test")              //  @"c:\test"
GetPathFirstLevel(@"c:")                   //  null

答案 1 :(得分:2)

注意:我想指出Regex并不是最适合这项工作的工具,使用File.IO API检查路径有效性更合适 - 对于我将指向@ dtb的答案。

然而,直接回答您的问题而不辩论其他方法的优点是:

用于从C:\Test中提取C:\Test\Test\Test\Test的正则表达式字符串是:{/ 1}}来自任何给定路径的[Drive]:\RootFolder

"[a-zA-Z]:\\[^\\]+"

[a-zA-Z]为您提供字符范围a-z或A-Z中的任何单个字符,从而覆盖大写和小写字母。

后跟:

后跟\(\是一个转义字符,所以它必须被转义才能使用它 - 你通过在它前面添加一个\来转义字符,所以在你需要的地方\你把\\ - 有意义吗?)< / p>

[^ \] +表示字符串的其余部分,但不包括\的下一个实例或其后的任何字符。

此外,如果您希望在字符串前面加上引号之外的@符号,您可以使用字符'未转义',如下所示:

@"[a-zA-Z]:\[^\]+"

答案 2 :(得分:1)

没有正则表达式。如果您知道要删除多少个字符,只需使用子字符串...

//numberOfChars is known...

string result = inputString.Substring(0, inputString.Length - numberOfChars -1);

答案 3 :(得分:1)

我个人会使用string.split()和Path.DirectorySeparatorChar来确定要拆分的内容。

答案 4 :(得分:1)

Path解决方案更好,但如果您仍然需要正则表达式(出于学习原因),则

Regex.Replace(@"c:\aaa\bb\c", @"^([^\\]*\\[^\\]*)\\.*", @"$1")

要打破它:

^      // begins with
(      // start capturing what you want to save
[^\\]* // zero or more characters that are _not_ backslash
\\     // followed by a backslash
[^\\]* // again zero or more characters that are _not_ backslash
)      // stop capturing
\\     // a backslash
.*     // followed by anything

然后$1给出捕获的值(即匹配第一个括号中的内容的文本)。