我是regex的新手,我希望在字符串末尾修剪已知数量的字符。该字符串代表一个文件路径,因此我想删除留下c:\test\test1\test2
的尾随字符而不是c:\test
。
我遇到的麻烦就是反斜杠。
我会用什么样的正则表达呢?
答案 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
给出捕获的值(即匹配第一个括号中的内容的文本)。