[英]Replacing / removing specific part of file names using regex
我是 C# 的新手,需要遍歷目錄並刪除以_xxxxxx.xml
結尾的所有文件的最后一部分(下划線后跟 6 位數字)。
例如,文件名filename_A_123_456789.xml
變為filename_A_123.xml
。
到目前為止我所擁有的:
private static void RenameFiles(string outputPath)
{
DirectoryInfo d = new DirectoryInfo(outputPath);
FileInfo[] infos = d.GetFiles();
foreach (FileInfo f in infos)
{
string newName = Regex.Replace(f.FullName, "(\\[_\d]\\s)", temp);
File.Move(f.FullName, newName);
}
}
但這行不通。 Ang CSharp Regexxers 在那里?
您可以使用正則表達式:
_\d{6}(\.[^.]+)$
並用$1
代替。
正則表達式匹配 6 位數字,然后第 1 組 ( (\.[^.]+)
) 匹配您在替換字符串中替換的擴展名。 擴展名由“一個點后跟一堆非點”匹配。 還要注意字符串的末尾錨$
來斷言所有這些都必須在字符串的末尾。
將您的代碼更改為:
string newName = Regex.Replace(f.FullName, @"_\d{6}(\.[^.]+)$", "$1");
正則表達式可以滿足您的需要。 作為替代方案,如果您想使用一個無正則表達式的解決方案:
public static void Main()
{
var source = @"filename_A_123_456789.xml";
var slices = Path.GetFileNameWithoutExtension(source).Split('_');
var last = slices.Last();
var isSpecific = last.Length == 6 && last.All(char.IsDigit);
var result = string.Join("_", isSpecific ? slices.Take(slices.Length - 1) : slices) + Path.GetExtension(source);
Console.WriteLine(result);
}
您的正則表達式不會以任何方式量化\d
來定義您正在尋找准確的 6 位數字。
改用這個:
(\S*)_\d{6}(\.xml) /m
此正則表達式將_
之前的所有非空白字符,后跟六位數字和擴展名.xml
捕獲到兩個單獨的捕獲組中。
然后替換為$1$2
,第 1 組,然后是第 2 組。
試試看嘛:
string newName = Regex.Replace(f.FullName, "(\\_\\d{6}\\.xml)", ".xml");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.