對於每個匹配,期待下一個'\'字符。所以你可能會得到「c:\ mydir \」。檢查該目錄是否存在。然後找到下一個\
,給出「c:\ mydir \ subdir」,檢查這條路徑,最終找到一條不存在的路徑,或者你將會到達下一個匹配的開始處
在這一點上,你知道要尋找什麼目錄下。然後,只需調用Directory.GetFiles
和匹配的字符串開始匹配你找到的最後一個路徑最長的文件名。
這應該儘量減少回溯。
下面是這個可以這樣做:
static void FindFilenamesInMessage(string message) {
// Find all the "letter colon backslash", indicating filenames.
var matches = Regex.Matches(message, @"\w:\\", RegexOptions.Compiled);
// Go backwards. Useful if you need to replace stuff in the message
foreach (var idx in matches.Cast<Match>().Select(m => m.idx).Reverse()) {
int length = 3;
var potentialPath = message.Substring(idx, length);
var lastGoodPath = potentialPath;
// Eat "\" until we get an invalid path
while (Directory.Exists(potentialPath)) {
lastGoodPath = potentialPath;
while (idx+length < message.Length && message[idx+length] != '\\')
length++;
length++; // Include the trailing backslash
if (idx + length >= message.Length)
length = (message.Length - idx) - 1;
potentialPath = message.Substring(idx, length);
}
potentialPath = message.Substring(idx);
// Iterate over the files in directory we found until we get a match
foreach (var file in Directory.EnumerateFiles(lastGoodPath)
.OrderByDescending(s => s.Length)) {
if (!potentialPath.StartsWith(file))
continue;
// 'file' contains a valid file name
break;
}
}
}
聽起來很明智! :-)今天晚些時候我會試一試,讓你知道它的價格。 – joce
確實比較快!在55K消息的運行中,我的解決方案平均約50秒,而您的平均值大概爲9秒!請記住,如果我通過實施您的解決方案來編輯您的文章? – joce
@Joce:去吧。 –