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

3
我刚接触正则表达式,想要从字符串末尾裁剪已知数量的字符。该字符串表示文件路径,因此我希望去掉末尾的字符,只留下c:\test。
但是,我遇到了反斜杠的问题。
我应该使用什么样的正则表达式来实现呢?
5个回答

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

好的回答,我同意这是正确的方法,但它并没有回答问题,即“使用正则表达式如何做到这一点”。 - BenAlabaster
@dtb - 我也分享了这份爱。 - BenAlabaster

2
注意:我想指出,正则表达式并不是这项工作最合适的工具,更适合使用File.IO API来检查路径的有效性 - 我将指向@dtb的答案。 然而,直接回答您的问题,不讨论其他方法的优点是:
用于从C:\Test\Test\Test\Test中提取C:\Test的正则表达式字符串,其中您希望从任何给定路径获取[Drive]:\RootFolder是:
"[a-zA-Z]:\\[^\\]+"

[a-zA-Z]可以匹配a-z或A-Z中的任意单个字符,因此涵盖了大小写。

接下来是一个:

接下来是\(\是转义字符,因此必须转义才能使用它-您可以通过在其前面加上\来转义字符,因此要放置\,您需要输入\\-有意义吗?)

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

此外,如果您愿意,在引号外面使用@符号前缀的字符串可以使用未转义的字符,如下所示:

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

1

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

//numberOfChars is known...

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

2
正确,但是使用Path类会更加清晰。 - Steven Sudit

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给出了捕获值(即与第一个括号中的内容匹配的文本)。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接