关于regex:regex-c-获取字符串的不匹配部分

Regex - C# - Get non matching part of string

我在下面写的regex模式与"finalfolder"之前的字符串匹配。如何在匹配regex的字符串之后获取文件夹名(在本例中为"finalfolder")?

编辑:我肯定我的regex搞错了。我的目的是匹配到"c:folderafolderbfoldercfolderd est 1.0folderefolderf",然后找到文件夹。因此,在本例中,我要查找的文件夹是"finalfolder"

1
2
3
4
5
6
7
8
    [TestMethod]
    public void TestRegex()
    {
        string pattern = @"[A-Za-z:]\\[A-Za-z]{1,}\\[A-Za-z]{1,}\\[A-Za-z0-9]{1,}\\[A-Za-z0-9]{1,}\\[A-Za-z0-9._s]{1,}\\[A-Za-z]{1,}\\[A-Za-z]{1,}";
        string textToMatch = @"C:\FolderA\FolderB\FolderC\FolderD\Test 1.0\FolderE\FolderF\FinalFolder\Subfolder\Test.txt";
        string[] matches = Regex.Split(textToMatch, pattern);
        Console.WriteLine(matches[0]);
    }


还有很多其他的提示和建议可以引导你找到想要的文件夹,我建议你考虑一下。但是,由于看起来您仍然可以从学习更多的regex技能中获益,下面是您要求的答案:获取字符串中不匹配的部分。

假设您的regex实际上与给定的路径匹配,例如:[A-Za-z]:\\[A-Za-z]+\\[A-Za-z]+\\[A-Za-z0-9]+\\[A-Za-z0-9]+\\[A-Za-z0-9._\s]+\\[A-Za-z]+\\[A-Za-z]+这样的模式。

您可以得到匹配的字符串、其位置和长度,然后确定下一个文件夹名在原始源字符串中的起始位置。但是,您还需要确定下一个文件夹名的结束位置。

1
2
3
4
5
6
MatchCollection matches = Regex.Matches(textToMatch, pattern);
if (matches.Count > 0 ) {
    Match m = matches[0];
    var remaining = textToMatch.Substring(m.Index + m.Length);
    //Now find the next backslash and grab the leftmost part...
}

这回答了您最常见的问题,但是这种方法会破坏使用regex的整个实用性。相反,只需扩展模式以匹配下一个文件夹!

regex模式已经提供了捕获匹配部分的能力。捕获文本的默认regex构造是一组括号。更好的是,.NET regex支持使用(?)的命名捕获组。

1
2
3
4
5
6
7
8
9
10
11
12
//using System.Text.RegularExpressions;

string pattern = @"(?<start>"  
        + @"[A-Za-z]:\\[A-Za-z]+\\[A-Za-z]+\\[A-Za-z0-9]+\\[A-Za-z0-9]+\\[A-Za-z0-9._\s]+\\[A-Za-z]+\\[A-Za-z]+"
        + @")\\(?<next>[A-Za-z0-9._\s]+)(\\|$)";
string textToMatch = @"C:\FolderA\FolderB\FolderC\FolderD\Test 1.0\FolderE\FolderF\FinalFolder\Subfolder\Test.txt";

MatchCollection matches = Regex.Matches(textToMatch, pattern);
if (matches.Count > 0 ) {
    var nextFolderName = matches[0].Groups["next"];
    Console.WriteLine(nextFolderName);
}

那么,使用FileInfo之类的东西?

1
(new FileInfo(textToMatch)).Directory.Parent.Name


正如在注释中发布的,您的regex似乎与整个字符串匹配。但是在这个特殊的情况下,由于您要处理一个文件名,所以我将使用fileinfo。

1
2
3
FileInfo fi = new FileInfo(textToMatch);
Console.WriteLine(fi.DirectoryName);
Console.WriteLine(fi.Directory.Name);

DirectoryName将是完整路径,而Directory.Name将只是有问题的子文件夹。