正则表达式-C#-获取字符串的不匹配部分
我在下面写的正则表达式模式与“FinalFolder”之前的字符串匹配。 如何在与正则表达式匹配的字符串之后获得文件夹名称(在本例中为“FinalFolder”) 编辑:我肯定我的正则表达式搞错了。我的目的是匹配到“C:\FolderA\FolderB\FolderC\FolderD\Test 1.0\FolderE\FolderF”,然后找到该文件夹。因此,在本例中,我要查找的文件夹是“FinalFolder”正则表达式-C#-获取字符串的不匹配部分,c#,regex,C#,Regex,我在下面写的正则表达式模式与“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);
}