正则表达式-C#-获取字符串的不匹配部分

正则表达式-C#-获取字符串的不匹配部分,c#,regex,C#,Regex,我在下面写的正则表达式模式与“FinalFolder”之前的字符串匹配。 如何在与正则表达式匹配的字符串之后获得文件夹名称(在本例中为“FinalFolder”) 编辑:我肯定我的正则表达式搞错了。我的目的是匹配到“C:\FolderA\FolderB\FolderC\FolderD\Test 1.0\FolderE\FolderF”,然后找到该文件夹。因此,在本例中,我要查找的文件夹是“FinalFolder” 如评论中所述,您的正则表达式似乎与整个字符串匹配。但是在这个特殊的例子中,因为您处

我在下面写的正则表达式模式与“FinalFolder”之前的字符串匹配。 如何在与正则表达式匹配的字符串之后获得文件夹名称(在本例中为“FinalFolder”)

编辑:我肯定我的正则表达式搞错了。我的目的是匹配到“C:\FolderA\FolderB\FolderC\FolderD\Test 1.0\FolderE\FolderF”,然后找到该文件夹。因此,在本例中,我要查找的文件夹是“FinalFolder”


如评论中所述,您的正则表达式似乎与整个字符串匹配。但是在这个特殊的例子中,因为您处理的是文件名,所以我会使用FileInfo

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

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

那么,使用
FileInfo
类似的内容

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

还有很多其他的提示和建议可以帮助你找到想要的文件夹,我建议你考虑一下。但是,因为看起来您仍然可以从学习更多的正则表达式技能中获益,下面是您想要的答案:获取字符串的不匹配部分

让我们假设您的正则表达式实际上匹配了给定的路径,例如一个模式,如:
[a-Za-z]:\\[a-Za-z]+\[a-Za-z]+\[a-Za-z0-9]+\[a-Za-z0-9]+\[a-Za-z0-9.\us]+\[a-Za-z]+\[a-Za-z]+\[a-Za-z]+

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

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的全部功能。相反,只需扩展您的模式以匹配下一个文件夹

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

//使用System.Text.RegularExpressions;
字符串模式=@“(?”
+@“[A-Za-z]:\\[A-Za-z]+\[A-Za-z]+\[A-Za-z0-9]+\[A-Za-z0-9]+\[A-Za-z0-9.\uS]+\[A-Za-z]+\[A-Za-z]+\[A-Za-z]+”
+@“\\(?[A-Za-z0-9.\uS]+)(\\\\\$)”;
字符串textToMatch=@“C:\FolderA\FolderB\FolderC\FolderD\Test 1.0\FolderE\FolderF\FinalFolder\Subfolder\Test.txt”;
MatchCollection matches=Regex.matches(textToMatch,pattern);
如果(matches.Count>0){
var nextFolderName=匹配[0]。组[“下一步”];
Console.WriteLine(下一个FolderName);
}

您的正则表达式似乎匹配整个字符串,而不仅仅是“FinalFolder”之前的字符串。模式与字符串不匹配。你让它匹配了吗?我会用一个子串。类似于
textToMatch.Substring(textToMatch.IndexOf(matches[0])+matches[0].Length)
。一旦你有了那个子字符串,你就可以匹配到它的第一个斜杠。总的来说,我认为正则表达式对于这项工作来说是错误的工具,但不管怎样。你可以用几种方法来完成它,这取决于对路径的了解。如果级别是固定的
^(?:[^\]*\\){level}(.*)$
,如果名称是固定的
^(?:[^\]*\\)*FolderF\\\(.*)$
,我想这是唯一的方法。抱歉-我正在查找匹配字符串后面的文件夹。不是文件的父文件夹。再次抱歉,我更新了问题。
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...
}
//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);
}