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实际上与给定的路径匹配,例如:
您可以得到匹配的字符串、其位置和长度,然后确定下一个文件夹名在原始源字符串中的起始位置。但是,您还需要确定下一个文件夹名的结束位置。
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); } |
那么,使用
1 |
正如在注释中发布的,您的regex似乎与整个字符串匹配。但是在这个特殊的情况下,由于您要处理一个文件名,所以我将使用fileinfo。
1 2 3 | FileInfo fi = new FileInfo(textToMatch); Console.WriteLine(fi.DirectoryName); Console.WriteLine(fi.Directory.Name); |