簡體   English   中英

使用正則表達式替換/刪除文件名的特定部分

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM